所以我对Python2.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会根据基类是否是原语类型而表现出不同的行为?这是一个bug吗?
发布于 2015-10-21 17:08:11
当我输入这段代码时,我对MRO进行了read a bit more,并发现(据我粗略了解) python有旧式(2.2之前)的类和新式的类。老式的MRO是从左到右的深度优先(这将提供DBAC),而新型的是一种称为C3的算法,我假设所有Python2.7类都使用该算法。将C3算法应用于具有这种继承层次结构的新样式类,从而得到DBCA。基本上在2.7中,继承自Object的类是新风格的,而不继承的类是旧风格的。我把2.7和3.0搞混了,在3.0中,所有的类都继承自Object。因此,如果D的任何基类继承自新样式的类,它们将为D提供新样式的MRO,否则本例中的D将具有旧样式的MRO。
这是一个很酷的小怪癖,我认为更多的人应该意识到。希望这是有意义的。
https://stackoverflow.com/questions/33255186
复制相似问题