1. MRO(Method Resolution Order)

MRO即Method Resolution Order(方法解析顺序),即在调用方法时,会对当前类以及所有的基类进行一个搜索,以确定该方法之所在,而这个搜索的顺序就是MRO。

一个类的 MRO 列表就是合并所有父类的 MRO 列表,并遵循以下三条原则:

  1. 子类永远在父类前面
  2. 如果有多个父类,会根据它们在列表中的顺序被检查
  3. 如果对下一个类存在两个合法的选择,选择第一个父类

遇到多继承则按代码中继承列表的顺序从左往右写。若有类A,其继承关系如下图所示:

接下来,我们就开始算出相应的MRO。即需遵循图里面的广度优先原则进行遍历(在广度优先原则的前提下又优先遍历左边的):
首先寻找整个图中入度为0的,也就是A,那么A也就成为MRO中的第一个。

然后我们去掉图中的A节点以及与A相关的连线,再寻找入度为0的点,这时有B和C两个节点,我们选择最左边的点即B。选完左边的B点后,再选右边的C点,这样B和C也就跟着进入了MRO序列,现在MRO序列为{A,B,C}。(注意每次层次遍历一定要把那一层选完才能选下一层,不能在没有选C之前跳到选E)

然后去掉B和C以及与它们相关的连线,这时候入度为0的也就是D、E、F了,依次选择,使D、E、F进入MRO序列。

最后也就使得object进入MRO序列。

最终类A的MRO序列也就是{ABCDEFobject}

使用 类名.mro()可以查阅其MRO表:

print(A.__mro__)

2. super方法

  1. supper(cls, inst)
    参数 cls : 某个类的父类名,
    参数 inst:这个类的实例(一般都传self)
    方法含义:
    获得的是类cls 在实例inst的 MRO 列表中的下一个类
class C:def md(self):print("this is C`s method")class B:def md(self):print("this is B`s method")class A(B,C):def md(self):print("this is A`s method")# super().md()super(B, self).md()if __name__ == '__main__':print(A.__mro__)a = A()a.md()
(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)
this is A`s method
this is C`s method
Process finished with exit code 0
  1. supper()

在上面的例子中,如果仅使用super().md(),
默认是按照类A的MRO顺序依次调用,其在类A中相当于super(A, self).md()。

Python之MRO相关推荐

  1. mro python_用python实现MRO算法

    引子: 如图反映了python3中,几个类的继承关系和查找顺序.对于类A,其查找顺序为:A,B,E,C,F,D,G,(Object),这并不是一个简单的深度优先或广度优先的规律.那么这个顺序到底是如何 ...

  2. Python中MRO

    MRO(方法解析顺序) 当有多重继承时,基于"从左到右,深度优先原则": class CommonBase():def Method(self):print('CommonBase ...

  3. python多继承顺序_Python多重继承方法解析顺序(MRO构建算法)

    分界 python的MRO算法有新旧两种,但并不是以python2和python3为界,具体的分隔为:在python2中如果定义类的时候没有指定父类是object,即定义为 class A: pass ...

  4. Python面向对象中super用法与MRO机制

    1. 引言 最近在研究django rest_framework的源码,老是遇到super,搞得一团蒙,多番查看各路大神博客,总算明白了一点,今天做一点总结. 2. 为什么要用super 1)让代码维 ...

  5. python新式类c3算法_Python新式类的方法解析顺序MRO与Super

    新式类与经典类的方法解析顺序 MOR(方法解析顺序) 经典类:深度优先 DFS python3以前 新式类:广度优先 python2.2 新式类:广度优先的C3算法实现(拓扑排序) BFS pytho ...

  6. python中的MRO与多继承

    相关概念: MRO:Method Resolution Order,即方法解析顺序,是python中用于处理二义性问题的算法 二义性: python支持多继承,多继承的语言往往会遇到以下两类二义性的问 ...

  7. 深入super,看Python如何解决钻石继承难题

    1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object):def __init__ ...

  8. python类的方法三种访问权_Python基础33-面向对象(继承资源(属性与方法)的使用注意)...

    在Python中, 继承是指子类对父类资源的使用权 1 继承-属性与方法的使用权限 1.1 测试属性与方法分别如下 公有属性/方法 受保护属性/方法 私有属性/方法 class Animal: a = ...

  9. python类的继承super方法_Python类的继承super相关原理解析

    看了网上许多关于super.mro.C3的介绍感觉没有一份很容易初学者理解的文档,直接看C3算法的话,比较难理解,也没必要,如果掌握一套规律的话,会轻松许多.我将网上这些博主的文章进行一个梳理总结,最 ...

  10. mro python_Python新式类的方法解析顺序MRO与Super

    新式类与经典类的方法解析顺序 MOR(方法解析顺序) 经典类:深度优先 DFS python3以前 新式类:广度优先 python2.2 新式类:广度优先的C3算法实现(拓扑排序) BFS pytho ...

最新文章

  1. python程序如何做界面_python是如何写界面程序的?
  2. c# 调用 WINDOW API DLL
  3. 自学python需要多长时间-自学Python需要多长时间?
  4. SpringMVC:后台将List转为Json,传值到页面
  5. 移动端访问mysql_java – (可能)数百个移动客户端访问MySQL数据库的最佳方法是什么?...
  6. python教程:列表(list)、元组(tuple)、字典(dict)
  7. 聚类分析1:层次聚类
  8. 向一个对象数组里面添加新的属性 + 将一个对象数组数据拿出来变成另一个对象
  9. Flowable学习笔记(二、BPMN 2.0-基础 )
  10. python 如何定义字典_python dict如何定义
  11. matlab如何画一个平面,matlab 画平面
  12. python读取html文件中的表格数据_使用解析html表pd.read_html文件其中单元格本身包含完整表...
  13. JS-面向对象---属性的特性 / 修改属性的特性
  14. path png转svg_如何将jpg或png图像转换成svg并保存?
  15. UI素材模板|优秀的后台管理系统UI面板
  16. R读取MySQL数据出现乱码,解决该问题的方法总结
  17. 【CCCC】L2-012 关于堆的判断 (25分),,手写堆,二叉树编号,向上调整
  18. 移植u-boot.2012.04.01
  19. .NET(WinCE、WM)开发转Android开发 ——Xamarin和Smobiler对比...
  20. unity安装2020或2019出现空白错误

热门文章

  1. 天线接收功率计算公式_无线发射功率以及接收灵敏度
  2. 今年阿里巴巴重要开源项目全在这里
  3. h, w = img.shape什么意思?
  4. redis-trib.rb和redis-cli部署redis主从集群的异同
  5. Latex 只在首页添加页眉页脚 修改局部字体大小
  6. html5电子时钟怎么往上移动,html5旋转 怎样用HTML5制作旋转时钟
  7. numpy 矩阵运算
  8. install par
  9. 百度地图API学习之定位当前位置及自定义覆盖物和信息窗口
  10. Entrez Direct-入门