(一)多继承

网上关于多继承、MRO和C3算法的讲解比较多,在此不再赘述。
我们可以利用类的__mro__ 属性或者 mro() 方法查看某个类的MRO列表(方法调用顺序)。

(二)经典案例

当执行子类对象的方法时,是不是一定会按照MRO去依次执行各父类的同名方法?
答案是否定的,只有当同名方法没有被重写时(即保留了super的调用),才会继续调用MRO中下一个类的同名方法。

class A(object):def __init__(self, a):print('A', a)class B(A):def __init__(self, b):print('B', b)super(B, self).__init__(b)class C(object):def __init__(self, c):print('C', c)class D(B, C):def __init__(self, d):print('D', d)super(D, self).__init__(d)print(D.__mro__)
d = D('d')

比如上面这段代码,我们执行过后发现打印是:

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <type 'object'>)
('D', 'd')
('B', 'd')
('A', 'd')

按MRO的顺序依次执行到D, B, A的__init__方法便停止了,并没有继续执行C的__init__方法。原因在于A的__init__方法并没有执行super调用父类的__init__
如果想要调用到C的__init__方法有2个改法:

  1. 在A的__init__方法里加上super调用。
class A(object):def __init__(self, a):print('A',)super(A, self).__init__(a)

但这种改法很明显会带来另一个问题:A无法被实例化。

  1. D的__init__方法中不执行super调用,而是显式调用B和C的__init__方法。
class D(B, C):def __init__(self, d):print('D', d)B.__init__(self, d)C.__init__(self, d)

实际上,但我们真的遇到了像上面的案例这种情况时,最好还是审慎考虑是否真的需要使用到多继承,实在没办法的话就只能按方法二用显式调用来替代super调用吧。

【参考资料】
[1] Python中的super()与MRO
[2] Python多重继承问题-MRO和C3算法

Python - 多继承与MRO相关推荐

  1. Python多继承mro示例

    Python多继承mro示例 以下是python方法解析顺序的示例,详细的解释见代码的注释部分. # 1 解释python mro的执行顺序,详见数字序号的顺序 class Base(object): ...

  2. python 多继承与super使用详解_继承中的MRO与super详解

    Python进阶-继承中的MRO与super 写在前面如非特别说明,下文均基于Python3 摘要 本文讲述Python继承关系中如何通过super()调用"父类"方法,super ...

  3. python多继承顺序_Python多继承以及MRO顺序的使用

    多继承以及MRO顺序 1. 单独调用父类的方法 # coding=utf-8 print("******多继承使用类名.__init__ 发生的状态******") class P ...

  4. Python中菱形继承的MRO顺序及property属性

    Python中菱形继承的MRO顺序及property属性 文章目录 Python中菱形继承的MRO顺序及property属性 一.Python中菱形继承的MRO顺序 1. 单独调用父类的方法 2. 多 ...

  5. python 多继承与super使用详解_Python super()方法、多继承以及MRO顺序

    仅供学习,转载请注明出处 单独调用父类的方法 需求:编写一个类,然后再写一个子类进行继承,使用子类去调用父类的方法1. 使用方法1打印: 胖子老板,来包槟榔. 那么先写一个胖子老板的父类,执行一下: ...

  6. Python多继承mro

    在python语言里是支持继承这一概念的,也就是一个class可以继承一些其他class方法或者数据,在继承的时候有的比较简单,比如下面这段代码就是classM继承了classA class A(): ...

  7. Python的继承多态

    Python的继承多态 文章目录 Python的继承多态 一.私有属性和私有方法 01. 应用场景及定义方式 02. 伪私有属性和私有方法 二.单例 01. 单例设计模式 单例设计模式的应用场景 02 ...

  8. 多继承以及MRO顺序【super().的使用】

    多继承以及MRO顺序 1. 单独调用父类的方法 # coding=utf-8print("******多继承使用类名.__init__ 发生的状态******") class Pa ...

  9. python多继承顺序及分配,python多继承的查找顺序是什么?

    1.查找顺序 (1)本地优先,自己定义或重写的方法优先.本地没有的,按照继承列表,从左往右查找: (2)单调性,所有子类,也要满足查找顺序.也就是说 A 继承 B C,A 会先找 B 再找 C.但是在 ...

最新文章

  1. IOS UITableView 加载未知宽高图片的解决方案
  2. 【Linux 内核】宏内核与微内核架构 ( 操作系统需要满足的要素 | 宏内核 | 微内核 | Linux 内核动态加载机制 )
  3. [Nodejs]初探nodejs学习笔记- 如何使用nodejs搭建简单的UDP聊天功能
  4. android gdb 远程调试工具,Android下用gdb远程调试办法
  5. Ajax解析laravelJSON,3分钟短文:Laravel请求体内JSON格式数据的处理办法
  6. 我的HTML学习之路03
  7. 查看服务器ip配置信息失败,U-Center 纳管戴尔的服务器报错“报错获取厂商信息失败,请确认IP、用户名、密码 、厂商、协议与配置文件是否正确”...
  8. Delphi基础教程图文版之开篇
  9. arcgispython空间插值_[转载]ARCGIS中几种空间插值简单比较
  10. 斑马打印机测试demo,一维码、二维码、字符串。可以保存创建模板以便于后续使用
  11. go mux子路由的基本使用
  12. 30 道 Vue 面试题,内含详细讲解(涵盖入门到精通,自测 Vue 掌握程度)
  13. web--拉灯泡切换黑天与白夜的精美动画
  14. 对学计算机学生礼仪,计算机系学生分会社团部主持人和礼仪队选拔大赛计划1.doc...
  15. 刚入职场需要用到的5个顶尖自学网
  16. 什么是大数据(个人理解)
  17. android 蒙版图片带拖动_snapseed安卓蒙版(snapseed拼接两张图片)V1.6.8 手机版
  18. CSS中vertical-align不起作用
  19. 当我跑步时,我在想什么
  20. 大旺中学2021年高考成绩查询,2021年肇庆中考分数线什么时候出来,查询入口公布时间规定...

热门文章

  1. 文件描述符(通俗易懂)
  2. 什么是容器(docker)
  3. 用c++编写公司人员管理系统(课程设计 vs2010)
  4. 查看已安装的虚拟环境
  5. html中dl块自适应高度,CSS高度自适应代码(用了都说好)
  6. 7-2 jmu-ds-顺序表区间元素删除 (15 分)
  7. Li.Finance 互操作性扩展到 Optimism
  8. EasyRecovery16MAC苹果版本Photo最新版数据恢复软件
  9. fanuc机械手臂与基恩士视觉的通讯设定
  10. 《HTML+CSS+JavaScript》之第4章 文本