0

所以我一直在对Python 2.7的精彩世界进行一些研究。多重继承和MRO,我在阅读时一直在尝试不同的例子,并且遇到了一些让我难以理解的东西。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的行为依赖于基类是一个原始类型?这是一个错误?

回答

1

当我输入关于MRO的这个I read a bit more,并发现(据我所知,从粗略的理解),python具有旧式(前2.2)类和新式类。旧式的MRO是从左到右的深度优先(这会给DBAC),而新式是一种叫做C3的算法,这是我假设所有Python 2.7类都使用的算法。将C3算法应用于具有此继承层次结构的新样式类别可以提供DBCA。基本上在2.7中,继承自Object的类是新风格的类,它们不是旧风格的。无论如何,我将2.7与3.0混淆,其中所有类都从Object继承。因此,如果D的任何基地继承自新式课程,则他们将给D一个新式的MRO,否则此示例中的D将具有旧式MRO。

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