python 单一继承定义_python 单继承、多继承、菱形继承

单继承与多继承

单继承:一个类只能继承一个父类的方式。

多继承:一个类可以继承多个父类的方式。

单继承:(生物角度)

人类->哺乳类动物->动物->生物->有机物....

多继承:(社会角度)

舞蹈老师(教舞蹈) 体育老师(运动) 爸爸(抽烟) 妈妈(打扫卫生)

我(舞蹈,运动,抽烟,打扫卫生)

单继承案例:

父类:

pass

子类(父类):

pass

多继承案例:

父类1:

pass

父类2:

pass

父类3:

pass

子类(父类1,父类2,父类3):

pass

多继承的问题所在:菱形继承或者钻石继承中的问题。

菱形继承的bug解决:

MRO列表和super 类

当我们定义一个菱形继承关系的时候,程序会自动生成一个新的MRO列表。

MRO列表: Method Realtion Order 方法关系列表。

MRO列表的生成采用了C3算法完成的。

C3算法的原则:1.子类永远在父类的前面2.同一等级的类,按照子类中的继承顺序摆放

super()调用的时候,不是查找父类!!!! 实际上super是查找MRO列表的上一个类

super()调用对象方法的时候不需要传入对象,自动传入

补充:如果需要查看mro列表,可以使用对象.mro() 方法查看(非必要~)

1.单继承案例

1 #单继承案例

2 ‘‘‘

3 爷爷类4 爸爸类5 儿子类6 ‘‘‘

7

8 #爷爷类

9 classGroundFather:10 #属性

11 skin = ‘黄色‘

12 #方法

13 defsay(self):14 print(‘说话中‘)15

16 #爸爸类

17 classFather(GroundFather):18 #属性

19 eye = ‘水汪汪的小眼睛‘

20 #方法

21 defwalk(self):22 print(‘走走~停停中~‘)23

24 #儿子类

25 classSon(Father):26 pass

27

28 #实例化儿子对象

29 erzi =Son()30 print(erzi)31 #输出结果:<__main__.son object at>

32

33 #调用方法或者属性

34 print(erzi.skin)35 #输出结果:黄色

36

37 print(erzi.eye)38 #输出结果:水汪汪的小眼睛

39

40 erzi.say()41 #输出结果:说话中

42

43 #erzi.walk()

44 #输出结果:

2.多继承案例

1 #多继承案例

2 ‘‘‘

3 音乐老师类:4 体育老师类:5 爸爸类:6 妈妈类:7 ‘‘‘

8 #音乐老师类

9 classMusicTeacher:10 #属性

11 cloth = ‘晚礼服‘

12 #方法

13 defsing(self):14 print(‘门前大桥下,路过一群鸭,快来快来数一数,2,4,6,7,8.。‘)15 #体育老师类

16 classSportTeahcer:17 #方法

18 defrun(self):19 print(‘跑步功能‘)20

21 defjump(self):22 print(‘you jump,i jump‘)23 #爸爸类

24 classFather:25 #方法

26 defsmoking(self):27 print(‘抽烟中~~‘)28 #妈妈类

29 classMother:30 #方法

31 defclear(self):32 print(‘打扫房间。。‘)33 #我的类(多继承)

34 classMe(Mother,Father,MusicTeacher,SportTeahcer):35 pass

36

37 #实例化对象

38 i =Me()39 #调用成员

40 print(i.cloth)41 #输出结果:晚礼服

42

43 i.sing()44 #输出结果:门前大桥下,路过一群鸭,快来快来数一数,2,4,6,7,8.。

45

46 i.jump()47 #输出结果:you jump,i jump

48

49 i.run()50 #输出结果:跑步功能

51

52 i.smoking()53 #输出结果:抽烟中~~

54

55 i.clear()56 #输出结果:打扫房间。。

3.菱形继承,BUG案例

1 #菱形继承,BUG案例

2 ‘‘‘

3 A类(动物类)4 B类(人类)5 C类(鸟类)6 D类(鸟人类)7 ‘‘‘

8 #动物类 A类

9 classAnimal:10 #发声的方法

11 defsay(self):12 print(‘Animal类准备开始发音‘)13 print(‘Animal类发音结束‘)14

15 #人类 B类

16 classHuman(Animal):17 #发音的方法

18 defsay(self):19 print(‘Human类准备开始发音‘)20 #调用父类中的发音功能

21 Animal.say(self)22 print(‘Human类发音结束‘)23

24 #鸟类 C类

25 classBird(Animal):26 #发音的方法

27 defsay(self):28 print(‘Bird类准备开始发音‘)29 #调用父类的发音功能

30 Animal.say(self)31 print(‘Bird类发音结束‘)32

33 #鸟人类

34 classBirdMan(Human,Bird):35 #发音的方法

36 defsay(self):37 print(‘BirdMan类准备开始发音‘)38 #调用人类的发音

39 Human.say(self)40 #调用鸟类的发音

41 Bird.say(self)42 print(‘BirdMan类发音结束‘)43

44 #实例化一个鸟人对象

45 bm =BirdMan()46 #调用说话方法

47 bm.say()48 ‘‘‘

49 输出结果:50 BirdMan类准备开始发音51 Human类准备开始发音52 Animal类准备开始发音53 Animal类发音结束54 Human类发音结束55 Bird类准备开始发音56 Animal类准备开始发音57 Animal类发音结束58 Bird类发音结束59 BirdMan类发音结束60 ‘‘‘

61 ‘‘‘

62 菱形继承中的bug所在,某个方法在继承中被多次调用!。(如果该方法具有唯一或者计时类似的特性则无法使用。)63 上面案例 Animal类在菱形继承中子类只调用一次但,而Animal类却被调用两次,这就是菱形继承的BUG64 Animal类准备开始发音65 Animal类发音结束66

67 ‘‘‘

68 #菱形继承中的bug所在,某个方法在继承中被多次调用!。(如果该方法具有唯一或者计时类似的特性则无法使用。)

4.菱形继承,super()解决BUG案例

1 #菱形继承,super()解决BUG案例

2 ‘‘‘

3 A类(动物类)4 B类(人类)5 C类(鸟类)6 D类(鸟人类)7 ‘‘‘

8

9 #动物类 A类

10 classAnimal:11 #发声的方法

12 defsay(self):13 print(‘Animal类准备开始发音‘)14 print(‘Animal类发音结束‘)15

16 #人类 B类

17 classHuman(Animal):18 #发音的方法

19 defsay(self):20 print(‘Human类准备开始发音‘)21 #调用MRO列表中的上一层类的发音功能

22 super().say()23 print(‘Human类发音结束‘)24

25 #鸟类 C类

26 classBird(Animal):27 #发音的方法

28 defsay(self):29 print(‘Bird类准备开始发音‘)30 #调用MRO列表中的上一层类的发音功能

31 super().say()32 print(‘Bird类发音结束‘)33

34 #鸟人类

35 classBirdMan(Human,Bird):36 #发音的方法

37 defsay(self):38 print(‘BirdMan类准备开始发音‘)39 #调用MRO列表中的上一层类的发音功能

40 super().say()41 print(‘BirdMan类发音结束‘)42

43 #实例化一个鸟人对象

44 bm =BirdMan()45 #调用说话方法

46 bm.say()47 ‘‘‘

48 输出结果:49 BirdMan类准备开始发音50 Human类准备开始发音51 Bird类准备开始发音52 Animal类准备开始发音53 Animal类发音结束54 Bird类发音结束55 Human类发音结束56 BirdMan类发音结束57 ‘‘‘

58 #MRO列表 -> BirdMan,Human,Bird,Animal,object

59 #查看super

60 print(super)#super是个类

61 #输出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值