0

所以我一直在对 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 行为会根据基类是否为原始类型而有所不同?这是一个错误吗?

4

1 回答 1

1

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

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

于 2015-10-21T09:08:10.667 回答