今天在學習python的時候遇到了 Error when calling the metaclass bases Cannot create a consistent method resolution order (MRO) for bases P2,P1這個異常,然后觀察了一下代碼發現了問題,原因是我寫多重繼承的時候因為父類的順序問題導致了python的方法解析順序出現了問題。
原代碼如下:
class P1(object): def foo(self): print 'called P1-foo()' class P2(object): def foo(self): print 'called P2-foo()' def bar(self): print 'called P2-bar()' class C1(P2,P1): pass class C2(P1,P2): def bar(self): print 'called C2-bar()' class GC(C1,C2):#這個類如果去掉的話也可以沒有錯誤,如果加上這個類后,按照這種寫法,會導致mro中無法在唯一確認類之間的關系,會導致繼承關系混亂(我的理解,由於類的祖先類的查找順序是廣度優先,而不是嘗試優先,所以它無法確認P1,P2在祖先圖譜中的順序) pass
其中紅色的地方就是出錯的地方。把p1與p2換下位置就好了。
我認為原理如下:
就像上面GC類后面的注釋一樣(
這個類如果去掉的話也可以沒有錯誤,如果加上這個類后,按照這種寫法,會導致mro中無法在唯一確認類之間的關系,會導致繼承關系混亂(我的理解,由於類的祖先類的查找順序是廣度優先,而不是嘗試優先,所以它無法確認P1,P2在祖先圖譜中的順序)
),如果加上GC類后它們的圖譜關系就如圖
python是無法確認P1在圖中的具體位置的。所以會報出MRO錯誤。
原文鏈接:http://www.cnblogs.com/yudy/archive/2013/06/10/3130521.html
注:以上現象是在經典類中出現的,在新式類中沒有此問題。但是可能你不能調用到你想調用的方法。