Python多继承之MRO算法

MRO即Method Resolution Order   方法解析顺序,它的提出主要是为了解决Python中多继承时,当父类存在同名函数时,二义性的问题

下面先看一个例子:

import inspect

class D:
    pass

class C(D):
    pass

class B(D):
    pass

class A(B, C):
    pass

if __name__ == ‘__main__‘:
    print(inspect.getmro(A))

B和C继承D   A继承B和C  这是一个简单的多继承,下面看Python3中的输出结果:

(<class ‘__main__.A‘>, <class ‘__main__.B‘>, <class ‘__main__.C‘>, <class ‘__main__.D‘>, <class ‘object‘>)

执行结果是 A ->B ->C ->D

在Python3中,MRO算法采用的是有向无环图的拓扑排序,这里我们采用剪枝的方法来分析:

如上图所示:首先找入度为0的点 A,因为没有类继承A,剪去A左右两边,得到 A ->:

接下来再找下一个入度为0的点(剪枝后没有类继承B和C了),B和C的入度为0,根据先取最左原则,剪去B的枝,得到 A ->B ->:

再找到入度为0的点为C,则剪去C的枝得到 A ->B ->C ->

最后得到: A ->B ->C ->D的顺序

接下来看Python2.7下的执行结果:

(<class __main__.A at 0x7f81a17ca1f0>, <class __main__.B at 0x7f81a17ca188>, <class __main__.D at 0x7f81a17ca0b8>, <class __main__.C at 0x7f81a17ca120>)

可以看到执行结果是 A ->B ->D ->C

这里和python3执行结果不同是因为 Python2.7的MRO算法采用的是深度优先搜索(子节点顺序:从左到右),所以是 A ->B ->D ->C

原文地址:https://www.cnblogs.com/FG123/p/9462780.html

时间: 2024-10-11 03:51:37

Python多继承之MRO算法的相关文章

python多继承与MRO

所有的函数名都可以理解为变量.python中就不存在类似C++的重载,因为python不允许出现相同的函数名.类的继承中,如果我们重写(overriding)一个函数,那不是重载,这个函数会覆盖父类中的同名函数. C3算法:保证每个类只调用一次 1. 什么是多继承 多继承就是一个类有多个父类. class Mother: pass class Father: pass class Child(Mother, Father): pass issubclass(Child, Mother) and

python多继承中MRO问题

主要参考 http://python.jobbole.com/85685/ 算法更新顺序 DFS : 存在多继承中无法重写问题 BFS:存在继承单调性问题 C3算法:算法像是 拓扑排序+优先最左 的方式 原文地址:https://www.cnblogs.com/fuzzier/p/9897404.html

Python 多继承与MRO-C3算法

继承关系图: 广度优先遍历:先找A,再找B.C,最后找D.E.(顺序:A.B.C) 深度优先遍历:先找A,再找B,接着找D.E(把B里面找完):然后找C.(顺序:A.B.D.E.C) MRO-C3 搜索: >>> class D: name = 'd' >>> class E: pass >>> class C: name = 'c' >>> class B(D,E): #继承多个父类,如:遗传爸爸和妈妈的基因. pass >&

Python多继承解析顺序的C3线性算法流程解析

Python多继承MRO 在Python2.1中,采用了经典类,使用深度优先算法解析. Python2.2中,引入了新式类,使用深度优先算法和广度优先算法. 在Python2.3以后的版本中,经典类和新式类共存,使用了DFS算法和C3算法. Python2中的经典类 class A(object): pass Python3的新式类 class A: pass C3算法 In computing, the C3 superclass linearization is an algorithm u

python的MRO算法

历史 python2.1 经典类 DFS(深度优先遍历) python2.2 引入新式类,经典类 DFS,新式类 BFS(广度优先遍历) python2.3-2.7 经典类 DFS,新式类 C3 python3 新式类 C3 U型继承和菱形继承 U型继承 对于DFS算法,MRO(方法解析顺序)为:CAXBY,最终拿到X的hello方法,没有问题 对于BFS算法,MRO为:CABXY,最终拿到B的hello方法,有问题 菱形继承 对于DFS算法,MRO(方法解析顺序)为:CAXB,最终拿到X的he

第二十天- 多继承 经典MRO 新式MRO super()

# 多继承:# 在继承关系中.?类自动拥有?类中除私有属性外其他所有内容.python?持多继承.子类可拥有多?类. 1 class ShenXian: # 神仙 2 3 def fei(self): 4 print("神仙都会?") 5 6 class Monkey: # 猴 7 8 def chitao(self): 9 print("猴?喜欢吃桃?") 10 11 class SunWukong(ShenXian, Monkey): # 孙悟空是神仙, 同时也

Python 面向对象继承

一 什么是面向对象的继承 比较官方的说法就是: 继承(英语:inheritance)是面向对象软件技术当中的一个概念.如果一个类别A"继承自"另一个类别B,就把这个A称为"B的子类别",而把B称为"A的父类别"也可以称"B是A的超类".继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码.在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功

python基础——继承实现的原理

python基础--继承实现的原理 1 继承顺序 class A(object): def test(self): print('from A') class B(A): def test(self): print('from B') class C(A): def test(self): print('from C') class D(B): def test(self): print('from D') class E(C): def test(self): print('from E')

python多继承

http://blog.csdn.net/pipisorry/article/details/46381341 There are two typical use cases forsuper: In a class hierarchy withsingle inheritance, super can be used to refer to parent classes withoutnaming them explicitly, thus making the code more maint