继承

  • 单继承

如:人类->哺乳类动物->动物->生物->有机物…

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
#动物类   A类
class Animal:
#发声的方法
def say(self):
print('Animal类准备开始发音')
print('Animal类发音结束')

#人类 B类
class Human(Animal):
#发音的方法
def say(self):
print('Human类准备开始发音')
#调用MRO列表中的上一层类的发音功能
super().say()
print('Human类发音结束')

#鸟类 C类
class Bird(Animal):
#发音的方法
def say(self):
print('Bird类准备开始发音')
# 调用MRO列表中的上一层类的发音功能
super().say()
print('Bird类发音结束')

#鸟人类
class BirdMan(Human,Bird):
#发音的方法
def say(self):
print('BirdMan类准备开始发音')
# 调用MRO列表中的上一层类的发音功能
super().say()
print('BirdMan类发音结束')

#实例化一个鸟人对象
bm = BirdMan()
#调用说话方法
bm.say()

#MRO列表 -> BirdMan,Human,Bird,Animal,object
#查看super
print(super)#super是个类

super()调用的时候,不是查找父类!实际上super是查找MRO列表的上一个类.
super()调用对象方法的时候不需要传入对象,自动传入
#补充:如果需要查看mro列表,可以使用对象.mro() 方法查看(非必要~)

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