這篇文章主要介紹了python的多重繼承的理解的相關資料,多重繼承不是多容易理解,這裡舉例說明幫助大家學習參考,需要的朋友可以參考下
python的多重繼承的理解
Python和C++一樣,支援多重繼承。概念雖然容易,但是困難的工作是如果子類別呼叫一個自身沒有定義的屬性,它是按照何種順序去到父類別尋找呢,尤其是眾多父類別中有多個都包含該同名屬性。
對經典類別和新式類別來說,屬性的尋找順序是不同的。現在我們分別來看經典類別和新式類別的兩種不同表現:
經典類別:
#! /usr/bin/python # -*- coding:utf-8 -*- class P1(): def foo(self): print 'p1-foo' class P2(): def foo(self): print 'p2-foo' def bar(self): print 'p2-bar' class C1(P1,P2): pass class C2(P1,P2): def bar(self): print 'C2-bar' class D(C1,C2): pass if __name__ =='__main__': d=D() d.foo() d.bar()
執行的結果:
p1-foo p2-bar
將程式碼實例,畫了一個圖,方便理解:
##從上面經典類別的輸出結果來看,當實例d呼叫foo()時,搜尋順序是D => C1 => P1,#實例d呼叫bar()時,搜尋順序是D = > C1 => P1 => P2總結:經典類別的搜尋方式是依照「從左到右,深度優先」的方式去尋找屬性。 d先查找自身是否有foo方法,沒有則查找最近的父類C1裡是否有該方法,如果沒有則繼續向上查找,直到在P1中找到該方法,查找結束。
新式類別:
#
#! /usr/bin/python # -*- coding:utf-8 -*- class P1(object): def foo(self): print 'p1-foo' class P2(object): def foo(self): print 'p2-foo' def bar(self): print 'p2-bar' class C1(P1,P2): pass class C2(P1,P2): def bar(self): print 'C2-bar' class D(C1,C2): pass if __name__ =='__main__': print D.__mro__ #只有新式类有__mro__属性,告诉查找顺序是怎样的 d=D() d.foo() d.bar()
(<class '__main__.D'>, <class '__main__.C1'>, <class '__main__.C2'>, <class '__main__.P1'>, <class '__main__.P2'>, <type 'object'>) p1-foo C2-bar
#總結:新式類別的搜尋方式是採用「廣度優先」的方式去尋找屬性。
以上是深入分析python的多重繼承的詳細內容。更多資訊請關注PHP中文網其他相關文章!