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

來源:互聯網
上載者:User

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

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.