所以我一直在研究python2.7多重继承和mro的奇妙世界,我在阅读时尝试了不同的例子,我遇到了一些让我困惑的东西。在
你的经典钻石:
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的算法,我假设所有python2.7类都使用这个算法。将C3算法应用于具有此继承层次结构的新样式类可以得到DBCA。基本上在2.7中,继承自}将具有一个旧样式的MRO。在
Object
的类是新样式,而不是旧样式的类。我把2.7和3.0搞混了,3.0中所有的类都是从Object
继承的。因此,如果D
的任何一个基继承自一个新样式的类,它们将给D
一个新样式的MRO,否则本例中的{这是一个很酷的小怪癖,我想更多的人应该意识到。希望这是有道理的。在
相关问题 更多 >
编程相关推荐