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的定义改为
为什么类结构的mro的行为会因基类是否为基元类型而不同?这是虫子吗?
在我打字的时候,我读了一些关于MRO的文章,发现(据我粗略的理解)python有旧样式(2.2之前的)类和新样式的类。旧样式的MRO首先是从左到右的深度(这将给予DBAC),而新样式是一个名为c3的算法,我假设所有的python 2.7类都使用这个算法。将c3算法应用于具有此继承层次结构的新样式类将得到dbca。在2.7中,从
这是一个很酷的小怪癖,我认为更多的人应该意识到。希望这是合理的。