Error when calling the metaclass bases Cannot create a consistent method resolution order (MRO) for bases


今天在學習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

 

注:以上現象是在經典類中出現的,在新式類中沒有此問題。但是可能你不能調用到你想調用的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM