继承
如:人类->哺乳类动物->动物->生物->有机物…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class GroundFather: skin = '黄色' def say(self): print('说话中')
class Father(GroundFather): eye = '水汪汪的小眼睛' def walk(self): print('走走~停停中~')
class Son(Father): pass
erzi = Son() print(erzi)
print(erzi.skin) print(erzi.eye) erzi.say() erzi.walk()
|
1 2
| 舞蹈老师(教舞蹈) 体育老师(运动) 爸爸(抽烟) 妈妈(打扫卫生) 我(舞蹈,运动,抽烟,打扫卫生)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class MusicTeacher: cloth = '晚礼服' def sing(self): print('门前大桥下,路过一群鸭,快来快来数一数,2,4,6,7,8.。')
class SportTeahcer: def run(self): print('跑步功能') def jump(self): print('you jump,i jump')
class Father: def smoking(self): print('抽烟中~~')
class Mother: def clear(self): print('打扫房间。。')
class Me(Mother,Father,MusicTeacher,SportTeahcer): pass
i = Me()
print(i.cloth) i.sing() i.jump() i.run() i.smoking() i.clear()
|
一个子类继承两个或多个父类,这些父类继承同一个父类。
注意:菱形继承中的bug所在,某个方法在继承中被多次调用!。(如果该方法具有唯一或者计时类似的特性则无法使用。)
菱形继承的bug解决:MRO列表和super类.
MRO列表的生成采用了C3算法完成的。
C3算法的原则:1.子类永远在父类的前面2.同一等级的类,按照子类中的继承顺序摆放.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| class Animal: def say(self): print('Animal类准备开始发音') print('Animal类发音结束')
class Human(Animal): def say(self): print('Human类准备开始发音') super().say() print('Human类发音结束')
class Bird(Animal): def say(self): print('Bird类准备开始发音') super().say() print('Bird类发音结束')
class BirdMan(Human,Bird): def say(self): print('BirdMan类准备开始发音') super().say() print('BirdMan类发音结束')
bm = BirdMan()
bm.say()
print(super)
super()调用的时候,不是查找父类!实际上super是查找MRO列表的上一个类. super()调用对象方法的时候不需要传入对象,自动传入
|
mixin模式
尽量不要写成根只有一个类,要忽略二级类与他的关系,要把二级类和根的类放在同一级。
1 2 3 4
| 1.mixin设计迷失可以在不对类的内容的修改前提下,扩展类的功能(添加父类) 2.更加方便的组织和维护不同的组建 3.可以根据开发需要任意调整功能 4.可以避免产生更多的类
|
注意:受继承关系限制,推荐只有两层的继承使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Fruit: pass
class South: pass
class North: pass
class Apple(Fruit,North): pass
class Pear(Fruit,North): pass
class Banana(Fruit,South): pass
class Orange(Fruit,South): pass
|