单继承与多继承

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

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

单继承:(生物角度)

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

多继承:(社会角度)

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

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

单继承案例:

父类:

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 #输出结果:

python 单一继承定义_python 单继承、多继承、菱形继承相关推荐

  1. python 单一继承定义_Python学习之单继承与多继承

    继承 面向对象编程语言的一个主要功能就是"继承". 继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. (1)单继承:pytho ...

  2. python中类的定义_python 类中定义类

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 现有自定义类(color.py)如下,类位于路径'userschuxingpyt ...

  3. python变量的定义_Python变量的定义

    Python变量的定义 Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此 ...

  4. python函数参数定义_python函数定义中的5种参数

    python函数参数定义 Python函数定义中的5种参数类型: (5 Types of Arguments in Python Function Definition:) default argum ...

  5. python和表格关系_python – 单表继承上的SQLAlchemy一对多关系...

    我之前正在努力解决这个问题.我能够让这种自我指涉关系发挥作用: class Employee(Base): __tablename__ = 'employee' id = Column(Integer ...

  6. python类class定义_python基础教程之类class定义使用方法

    面对对象(oop)中的对象,是一个非常重要的知识点,我们可以把它简单看做是数据以及由存取.操作这些数据的方法所组成的一个集合.我们在学习函数(function)之后,知道了如果重用代码,那为什么还要用 ...

  7. python中算法定义_python算法

    引言 定义:算法就是按照一定步骤解决问题的办法 属性: 正确:就是可以正确的求解问题 快速:就是时间复杂度要尽量小 有穷性:要在有限个步骤解决问题 渐进分析法为什么可以做到与算法运行硬件环境无关? 算 ...

  8. python链表怎么定义_Python数据结构之双向链表的定义与使用方法示例

    本文实例讲述了Python数据结构之双向链表的定义与使用方法.分享给大家供大家参考,具体如下: 和单链表类似,只不过是增加了一个指向前面一个元素的指针而已. 示意图: python 实现代码: #!/ ...

  9. python语言字符串定义_Python字符串(string)

    简介 字符串(string)类型是python标准类型之一,也就是"文本"类型,并且字符串是不可更改的数据类型,意味着不能单独改变其中的某个值.与其他语言不同,python中没有字 ...

  10. python输入python显示未定义_python 未定义

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! sdk 3.0 实现了统一化,各个语言版本的 sdk具备使用方法相同.接口调用方 ...

最新文章

  1. mysql集群安装(centos)
  2. 23-hadoop-hive的DDL和DML操作
  3. Linux主机WordPress伪静态设置方法
  4. vmware虚拟机移植带来的问题
  5. centos yum安装时出现 cannot find a valid baseurl for repo: addons
  6. 头发一周洗几次才适宜? - 生活至上,美容至尚!
  7. html加载完显示图片,js图片未加载完显示loading效果
  8. python3 将unicode转中文
  9. Windows 8.1 升级到专业版
  10. 动态壁纸小程序(带流量主)源码
  11. 面试官系统精讲Java源码及大厂真题 - 45 Socket 源码及面试题
  12. 浅析Ruby on Rails部署方案(三)
  13. 外参矩阵转四元数,左右手坐标系转化1
  14. python 10的次方_python e次方
  15. R语言初级教程(01): R编程环境的搭建
  16. fflush()函数
  17. linux系统下mysql编码格式,Windows、Linux系统下mysql编码设置
  18. shell 命令下载软件 安装软件
  19. Cesium for Unreal 数据加载 场景漫游 粒子效果 视频监控 VR预览
  20. 回忆着你对我的承诺、一切的一切在那个夏季散了

热门文章

  1. BUUCTF:[0CTF 2016]piapiapia
  2. Kryo 缓冲区溢出
  3. php插入图片适应屏幕,PHPExcel:如何在首页页眉中插入图片并将其放大以适应其内容?...
  4. 第五次:对比分析《大唐仙妖劫》和《梦幻西游》
  5. redission限流RedisException问题排查
  6. 【DirectX学习笔记】02_D3D初始化
  7. web页面实现剪切板图片黏贴功能
  8. android编程异常解决 FATAL EXCEPTION: main android.view.InflateException: Binary XML file line #195: Erro
  9. 《娱乐至死》读书笔记(part2)--到处是水却没有一滴水可以喝
  10. python编程基础及应用(重庆大学):7-7 计算用户输入句子中的单词数量以及单词平均长度