面向对象二
一.继承的另一种使用方式
最常见的是直接继承一个已经存在的类
当你想要创建一个新的类 发现这个类中的一些 在某一个类中已经存在
1 class MyList(list): 2 def __init__(self,element_cls): 3 # 当你覆盖了init方法时 4 # 不要忘记调用super().init函数让父类完成原有的初始化操作 5 super().__init__() 6 self.element_cls = element_cls 7 8 9 def append(self, object): 10 # if isinstance(object,str) 11 if object.__class__ == self.element_cls: 12 super().append(object) 13 else: 14 print("只能存储%s类型!" % self.element_cls.__name__)
2.super()的问题 mro列表
python支持多继承 一个类可以同时继承多个父类
1 class A: 2 def test(self): 3 print("from A") 4 super().test() # 应该报错..... 但是却执行成功了 5 class B: 6 def test(self): 7 print("from B") 8 pass 9 10 class C(A,B): 11 pass 12 13 c = C() 14 c.test()
注意事项: 尽量不要使用多继承
二. 组合
指的是 一个类把另一个类的对象作为自己的属性 就称之为组合
无处不在
当你定义一个类 并且这个类拥有某种类型的属性时 就称之为组合
都是用用来重用代码的方式:
组合描述的是 什么拥有什么的关系 什么有什么,什么有什么
基础描述的是 什么是什么的关系 什么是什么,什么是什么
1 class PC: 2 def open_app(self,app_name): 3 print("open %s" % app_name) 4 5 class OldBoyStudent: 6 def __init__(self,PC,notebook): 7 self.PC = PC 8 self.notebook = notebook 9 pass 10 11 pc = PC() 12 notebook = PC() 13 14 15 stu = OldBoyStudent(pc,notebook)
三.新式类与经典类
1 class A: 2 # a = 1 3 pass 4 5 class B(A): 6 # a = 2 7 pass 8 9 class C(A): 10 # a = 3 11 pass 12 13 class D(A): 14 # a = 4 15 pass 16 17 class E(B,C,D): 18 # a = 5 19 pass 20 21 e1 = E()
1 class USB: 2 3 def open(self): 4 pass 5 6 def close(self): 7 pass 8 9 def work(self): 10 pass
使用接口可以提高程序的扩展性
只要对象按照接口规定方法来实现,使用者就可以无差别使用所有对象
五.抽象类
抽象:指的就是,不清楚,不明白,看不懂
抽象方法:指的是 没有函数体的方法 用@abc.abstractmethod 装饰器,如果类中具备抽象方法 那么这个类就称之为抽象类
抽象与接口的区别:不能直接实例化 必须有子类覆盖了所有抽象方法后才能实例化子类
举例:
1 import abc 2 3 class Test(metaclass=abc.ABCMeta): 4 5 @abc.abstractmethod 6 def say_hi(self): 7 pass 8 9 class TT(Test): 10 11 def say_hi(self): 12 print("i am TT obj") 13 14 t = TT() 15 t.say_hi()
六.鸭子类型
鸭子类型:说如果一个对象叫声像鸭子,走路像鸭子,长得像鸭子,那它就是鸭子
python不喜欢限制一个人,鸭子类型就是python推荐的方法:
举例如下:
1 class PC(): 2 3 def conntent_device(self, usb_device): 4 usb_device.open() 5 usb_device.work() 6 usb_device.close() 7 8 class Mouse: 9 # 实现接口规定的所有功能 10 def open(self): 11 print("mouse opened") 12 13 def work(self): 14 print("mouse working...") 15 16 def close(self): 17 print("mouse closed") 18 19 mouse = Mouse() 20 pc = PC() 21 22 pc.conntent_device(mouse) 23 24 25 26 class KeyBoard: 27 def open(self): 28 print("KeyBoard opened") 29 30 def work(self): 31 print("KeyBoard working...") 32 33 def close(self): 34 print("KeyBoard closed") 35 36 key1 = KeyBoard() 37 38 # 如果key1的特征和行为都像USB设备 那就把它当做USB设备来使用 39 # 对于使用者而言可以不用关心这个对象是什么类,是如如何是实现, 40 pc.conntent_device(key1)
示例二:
1 class Linux: 2 def read_data(self,device): 3 data = device.read() 4 return data 5 6 def write_data(self,device,data): 7 device.write(data) 8 9 class Disk: 10 def read(self): 11 print("disk reading....") 12 return "这是一个磁盘上的数据" 13 14 def write(self,data): 15 print("disk writing %s..." % data) 16 17 class UP: 18 def read(self): 19 print("disk reading....") 20 return "这是一个U盘上的数据" 21 22 def write(self,data): 23 print("disk writing %s..." % data) 24 25 26 l = Linux() 27 28 d = Disk() 29 data = l.read_data(d) 30 l.write_data(d,"这是一个数据....") 31 32 33 up1 = UP() 34 l.read_data(up1) 35 l.write_data(up1,"一个数据...")

浙公网安备 33010602011771号