为解决 Python 2.2 中 MRO 所存在的问题,Python 2.3以后采用了 C3 方法来确定方法解析顺序。你如果在 Python 2.3 以后版本里输入上述代码,就会产生一个异常,禁止创建具有二义性的继承关系:

>>> class C(A, B): pass

Traceback (most recent call last):

File "", line 1, in

class C(A, B): pass

TypeError: Error when calling the metaclass bases

Cannot create a consistent method resolution

order (MRO) for bases X, Y

我们把类 C 的线性化(MRO)记为 L[C] = [C1, C2,…,CN]。其中 C1 称为 L[C] 的头,其余元素 [C2,…,CN] 称为尾。如果一个类 C 继承自基类 B1、B2、……、BN,那么我们可以根据以下两步计算出 L[C]:`

L[object] = [object]

L[C(B1…BN)] = [C] + merge(L[B1]…L[BN], [B1]…[BN])

这里的关键在于 merge,其输入是一组列表,按照如下方式输出一个列表:

1.检查第一个列表的头元素(如 L[B1] 的头),记作 H。

2.若 H 未出现在其它列表的尾部,则将其输出,并将其从所有列表中删除,然后回到步骤1;否则,取出下一个列表的头部记作 H,继续该步骤。

3.重复上述步骤,直至列表为空或者不能再找出可以输出的元素。如果是前一种情况,则算法结束;如果是后一种情况,说明无法构建继承关系,Python 会抛出异常。

该方法有点类似于图的拓扑排序,但它同时还考虑了基类的出现顺序。我们用 C3 分析一下刚才的例子。

object,X,Y 的线性化结果比较简单:

L[object] = [object]

L[X] = [X, object]

L[Y] = [Y, object]

A 的线性化计算如下:

L[A] = [A] + merge(L[X], L[Y], [X], [Y])

= [A] + merge([X, object], [Y, object], [X], [Y])

= [A, X] + merge([object], [Y, object], [Y])

= [A, X, Y] + merge([object], [object])

= [A, X, Y, object]

到了最后一步我们没有办法继续计算下去 了:X 虽然是第一个列表的头,但是它出现在了第二个列表的尾部;Y 虽然是第二个列表的头,但是它出现在了第一个列表的尾部。因此,我们无法构建一个没有二义性的继承关系,只能手工去解决(比如改变 B 基类中 X、Y 的顺序)。

我们再看一个没有冲突的例子:

计算过程如下:

L[object] = [object]

L[D] = [D, object]

L[E] = [E, object]

L[F] = [F, object]

L[B] = [B, D, E, object]

L[C] = [C, D, F, object]

L[A] = [A] + merge(L[B], L[C], [B], [C])

= [A] + merge([B, D, E, object], [C, D, F, object], [B], [C])

= [A, B] + merge([D, E, object], [C, D, F, object], [C])

= [A, B, C] + merge([D, E, object], [D, F, object])

= [A, B, C, D] + merge([E, object], [F, object])

= [A, B, C, D, E] + merge([object], [F, object])

= [A, B, C, D, E, F] + merge([object], [object])

= [A, B, C, D, E, F, object]

当然,可以用代码验证类的 MRO,上面的例子可以写作:

>>> class D(object): pass

>>> class E(object): pass

>>> class F(object): pass

>>> class B(D, E): pass

>>> class C(D, F): pass

>>> class A(B, C): pass

>>> A.__mro__

(, , ,

mro python_python中的MRO算法[转]相关推荐

  1. python中的MRO与多继承

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

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

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

  3. 深度学习中的优化算法之BGD

    之前在https://blog.csdn.net/fengbingchun/article/details/75351323 介绍过梯度下降,常见的梯度下降有三种形式:BGD.SGD.MBGD,它们的 ...

  4. php查找二维数组下标,PHP实现二维数组中的查找算法小结

    本文实例讲述了PHP实现二维数组中的查找算法.分享给大家供大家参考,具体如下: 方法1:silu从左下角最后一行的第一个元素开始,遍历.如果小于target 则遍历该行的所有元素,找到结束.如果大于继 ...

  5. Java虚拟机规范阅读(二)IEEE754简介以及Java虚拟机中的浮点算法

    什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数.典型的比如相对于浮点数的定点数(Fixed Point Number).在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置 ...

  6. 深度学习中的优化算法串讲

    Datawhale原创 作者:谢文睿,Datawhale成员 寄语:优化算法是一个超参数,一个优化算法不是适合所有损失函数的,没有哪个优化算法是绝对的好或绝对的坏,是要根据损失函数判断的 本文对深度学 ...

  7. C++中的STL算法详解

    1.STL算法详解 STL提供能在各种容器中通用的算法(大约有70种),如插入.删除.查找.排序等.算法就是函数模板,算法通过迭代器来操纵容器中的元素.许多算法操作的是容器上的一个区间(也可以是整个容 ...

  8. 在医学图像分析中使用ICP算法进行点云配准

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文转载自「计算机视觉工坊」,该公众号重点在于介绍深度学习.智能驾驶等领域,一个小众的公众号. 论文标 ...

  9. 全基因组关联分析中上位性检测算法的研究

    全基因组关联分析中上位性检测算法的研究 前言 这个项目主要是分享一些全基因组关联分析中上位性检测算法的研究经验,算是,怎么入门,写这么个东西,一是做总结,二是咱实验室估计以后还会有做这个方向的,备着吧 ...

  10. 机器学习中的最优化算法总结

    https://www.toutiao.com/a6672189997212238348/ 导言 对于几乎所有机器学习算法,无论是有监督学习.无监督学习,还是强化学习,最后一般都归结为求解最优化问题. ...

最新文章

  1. 职业-把工作当作职业 or 事业?
  2. 十步完全理解 SQL
  3. Centos安装postgreSQL
  4. python日记----2017.8.1
  5. 一文掌握深度学习、神经网络和学习过程的历史
  6. 实用的编程网站—良好的开端
  7. 【月入百万】,资深股民恐怕都不知道
  8. 启动docker容器报错 driver failed programming external connectivity on endpoint
  9. 面试题分享,麻麻再也不用担心我的面试了
  10. 下载 MIUI任意型号卡刷包/线刷包
  11. 说说我是如何拿下腾讯offer的
  12. 【肝帝一周总结:全网最全最细】十万字python教程,学不会找我!教到你会为止!!内容超多,建议收藏慢慢看!
  13. 电脑怎么修改html5,详细教你怎么设置电脑默认浏览器
  14. Linux下oracle11Gr2(64位)安装说明
  15. slf4j没有在linux中生成日志,slf4j日志记录问题 - 未生成日志文件
  16. nodejs实现VSCode中的open with five server功能
  17. Setup Time与Hold Time
  18. Fast R-CNN 论文详读
  19. Fe3O4@SiO2硅包铁核壳纳米颗粒|链霉亲和素修饰的四氧化三铁颗粒|正硅酸乙酯(TEOS)进修饰改性磁性Fe3O4纳米颗粒
  20. 2021年江西省安全员C证考试题及江西省安全员C证免费试题

热门文章

  1. Unity Shader Interior mapping 内部映射
  2. springboot总结(一)
  3. 读万卷书,行万里路,写万行Code
  4. redis trib 常用命令
  5. 电动自行车新国标正式实施 二季度数码市场需求好转
  6. 搜狗推送接口-搜狗推送口子
  7. 十个值得所有极客收藏的网站
  8. js弹出框 确定 取消
  9. ARM GIC(六) GIC V3 电源/功耗管理 分析笔记。
  10. eclipse 实用的快捷键