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。

這是一個很酷的小怪癖,我想更多的人應該知道。希望這是有道理的。