通过动态类把属性定义、方法定义(数据变量、函数)集成在一起就是封装。
多父系继承和多层级继承。
多态性是相同的函数可以作用于所种类型的对象上并获得不同的结果。
class FishBox(Box2):
def __init__(self, lenght1, with1, height1):
# super实现父类与子类的关联
super().__init__(lenght1, with1, height1)
self.price = 0
self.amount = 0
self.type1= ('大礼盒', '小礼盒')
def countBoxNums(self, fish_nums,f_type_index):
if f_type_index ==0:
self.amount=20
else:
self.amount = 10
if fish_nums%self.amount == 0:
return fish_nums/self.amount
else:
return fish_nums/self.amount+1
def total(self,box_nums,price):
return box_nums*price
from Class_module import FishBox
big_gift_box = FishBox(60,30,40)
big_gift_box.price = 1000
big_gift_box.amount = 20
big_gift_box.weight=10
print('大礼盒的体积是%d立方厘米' % (big_gift_box.volume()))
print('大礼盒的表面积是%d平方厘米' % (big_gift_box.area()))
index = big_gift_box.type1.index('大礼盒')
g_box_num = big_gift_box.countBoxNums(200, index)
print('200条鱼需要%d个大礼盒' % (g_box_num))
print('200条鱼装大礼盒的价值为 %d RMB' % (g_box_num*big_gift_box.price))
print('===========================================')
small_gift_box = FishBox(50, 20, 30)
small_gift_box.price = 500
small_gift_box.amount = 10
small_gift_box.weight = 5
print('小礼盒的体积是%d立方厘米' % (small_gift_box.volume()))
print('小礼盒的表面积是%d平方厘米' % (small_gift_box.area()))
index = small_gift_box.type1.index('小礼盒')
g_box_num = small_gift_box.countBoxNums(200, index)
print('200条鱼需要%d小礼盒' % (g_box_num))
print('200条鱼装小礼盒的价值为 %d RMB' % (g_box_num*small_gift_box.price))
Result
大礼盒的体积是72000立方厘米
大礼盒的表面积是10800平方厘米
200条鱼需要10个大礼盒
200条鱼装大礼盒的价值为 10000 RMB
===========================================
小礼盒的体积是30000立方厘米
小礼盒的表面积是6200平方厘米
200条鱼需要20小礼盒
200条鱼装小礼盒的价值为 10000 RMB
类分为动态类、静态类。
实例由动态类生成,核心是属性和方法。
动态类:DynamicClass
静态类:StaticClass
区别:
# 在类模块文件Class_module.py中增加一个静态类
class SHost():
# 定义静态类
# 类局部变量
name = 'Tom'
age = 20
address = 'China'
call = '28380000'
静态类的调用(Main_SHost.py)
from Class_module import SHost
print(SHost.name)
print(SHost.age)
print(SHost.address)
print(SHost.call)
# 在调用处可以直接修改静态类变量值
SHost.name = 'Joyce'
print(SHost.name)
运行结果
Tom
20
China
28380000
Joyce
实现类的独立存储并供别人调用
# 从inher_BoxClass模块文件导入所有的类
from inher_BoxClass import *
# 使用Box2 类创建my_box2实例
my_box2 = Box2(10, 10, 10)
print('立方体的体积是:%d' % (my_box2.volume()))
print('立方体的表面积是:%d' % (my_box2.area()))
print('5个立方体的体积是:%d' % (my_box2.volume(5)))
print('颜色:', my_box2.color1)
print('材质:', my_box2.material1)
print('类型:', my_box2.type1)
将类定义的变量或者函数变成私有(private),只允许这个类访问。在名字面前加上双下划线即可。
可以把say前的双下划线删除运行一下。
class TeatPrivate():
def __init__(self):
# 在实例处,__say属性实例将无法看到
self.__say = 'OK'
def p(self):
print(self.__say)
# 在实例处,__p1()属性实例将无法看到
def __p1(self):
print(self.__say)
# 主程序调用类实例
show = TeatPrivate()
show.p()
# 只能看到实例show对应的p()方法