Python 2.7 MRO表现得很奇怪

Python 2.7 MRO behaves strangely

本问题已经有最佳答案,请猛点这里访问。

所以我一直在做一些关于Python2.7多重继承和MRO的研究,我在阅读时尝试了不同的例子,我遇到了一些真正困扰我的事情。

所以你有一个经典的钻石MI例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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的行为会因基类是否为基元类型而不同?这是虫子吗?


在我打字的时候,我读了一些关于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。

这是一个很酷的小怪癖,我认为更多的人应该意识到。希望这是合理的。