【问题标题】:Python 2.7 MRO behaves strangely [duplicate]Python 2.7 MRO 行为异常[重复]
【发布时间】:2015-10-21 09:08:10
【问题描述】:

所以我一直在对 Python 2.7 多重继承和 MRO 的美妙世界进行一些研究,并且在阅读时尝试了不同的示例,我遇到了一些让我非常困惑的事情。

所以你已经有了经典的钻石 MI 示例:

class A:
    def __init__(self):
        print "A"

class B(A):
    pass

class C(A):
    def __init__(self):
        print "C"

class D(B, C):
    pass

instance = D()

在我读过的所有 MRO 资源中,这个例子应该有一个 DBCA 的 MRO,所以初始化 D 应该打印“C”,而是打印“A”。奇怪的是,当我将 A、B、C 或 D 的定义更改为 int 之类的子类时,它给了我打印“C”的预期行为

为什么类结构的 MRO 行为会因基类是否为原始类型而有所不同?这是一个错误吗?

【问题讨论】:

    标签: python python-2.7 multiple-inheritance method-resolution-order


    【解决方案1】:

    当我输入此内容时,我read a bit more 关于 MRO 并发现(据我粗略了解)python 具有旧式(2.2 之前)类和新式类。旧式 MRO 是从左到右深度优先的(这将提供 DBAC),而新式是一种称为 C3 的算法,我假设所有 python 2.7 类都使用它。将 C3 算法应用于具有此继承层次结构的新样式类会得到 DBCA。基本上在 2.7 中,从 Object 继承的类是新样式的,而不是旧样式的类。我将 2.7 与 3.0 混淆了,其中所有类都继承自 Object。因此,如果D 的任何基类继承自新式类,它们将为D 提供新式MRO,否则在此示例中D 将拥有旧式MRO。

    这是一个很酷的小怪癖,我认为应该让更多人知道。希望这是有道理的。

    【讨论】:

      猜你喜欢
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 2015-12-13
      相关资源
      最近更新 更多