10.9 类与面向对象编程
10.9.1 封装(Encapsulation)
通过动态类把属性定义、方法定义(数据变量、函数)集成在一起就是封装。
10.9.2 继承(Inheritance)
多父系继承和多层级继承。
10.9.3 多态(Polymorphism)
多态性是相同的函数可以作用于所种类型的对象上并获得不同的结果。
10.9.4类编写注意事项
- 属性和方法命名不可重复。在开发代码前,统一对命名规则进行定义。
- 不要直接使用动态类内的数据变量
- 当类会变得庞大时,应该进行黑拆分
- 可以在类内引用外面已经定义的函数。在自定义模块前导入函数模块即可。
10.9.5 P141例题
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
10.8 静态类和动态类
类分为动态类、静态类。
实例由动态类生成,核心是属性和方法。
动态类:DynamicClass
静态类:StaticClass
区别:
- 静态类灭有self关键字,也就是不能被实例化
- 静态类不能通过类名传递参数
- 静态类不支持__init__()初始化函数
- 静态类不能被真正实例化,但是可以集成变量或函数,是一个带结构的数据类型。
案例
# 在类模块文件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
10.7 类模块使用
10.7.1 导入方式
10.7.2 类模块文件独立存放到指定路径里的使用方法
10.6 把类放到模块中
实现类的独立存储并供别人调用
10.6.1 建立独立类模块的过程
- 建立空白的python模块文件
- 把自定义类放到 Class_private.py 文件里。
- 在主程序代码文件导入自定义类。
- 在主程序使用自定义类。
10.6.2 案例 将盒子类放到模块中
# 从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)
10.5 私有(Private)
将类定义的变量或者函数变成私有(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()方法