博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python多继承之MRO算法
阅读量:4356 次
发布时间:2019-06-07

本文共 1013 字,大约阅读时间需要 3 分钟。

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

下面先看一个例子:

import inspectclass D:    passclass C(D):    passclass B(D):    passclass A(B, C):    passif __name__ == '__main__':    print(inspect.getmro(A))

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

(
,
,
,
,
)

执行结果是 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的顺序

多继承的mro其原理是c3算法:

MRO是一个有序列表L,在类被创建时计算

L(A(B,C)) = A + merge(L(B) ,L(C) ,(BC))          = A + merge(BD,CD,BC)          = A + B + merge(D,CD,C)          = A + B + C + merge(D,D)          = A + B + C + D          = A -> B -> C ->D

C3每次会去寻找是表头并且不是其它表的表尾,如经过第二轮 B是表头且不是剩余表的表尾,此时 提出B,得到 A + B + merge(D,CD,C),依次计算到最后一个表,即得到顺序:A -> B -> C ->D

转载于:https://www.cnblogs.com/FG123/p/9462780.html

你可能感兴趣的文章
FastJson
查看>>
excel4j
查看>>
Thread
查看>>
HtmlEmail
查看>>
ThreadLocal
查看>>
线程池
查看>>
XMAL 中x名称控件的Auttribute
查看>>
java笔记11-内部类
查看>>
基本数据类型
查看>>
BZOJ 1004 [HNOI2008]Cards
查看>>
[POJ 2689] Prime Distance
查看>>
[ 原创 ] Linux下查找指定类型文件以及删除
查看>>
win10环境下jdk1.8+Android Developer Tools Build: v22.3.0-887826的问题
查看>>
辗转相除法求最大公约数
查看>>
Centos7 安装mysql5.7.16
查看>>
java串口通信与打卡器交互
查看>>
<CoreJava> 5.2 Object:所有类的超类
查看>>
输入年月日计算是星期几
查看>>
redis部分配置与报错解决
查看>>
Python Challenge(0-8)
查看>>