今天小編給大家分享的是關于Python多重繼承中的菱形繼承介紹,相信很多人都不太了解,為了讓大家更加了解Python多重繼承中的菱形繼承,所以給大家總結了以下內容,一起往下看吧。一定會有所收獲的哦。
創新互聯建站主營淮南網站建設的網絡公司,主營網站建設方案,手機APP定制開發,淮南h5小程序定制開發搭建,淮南網站營銷推廣歡迎淮南等地區企業咨詢
繼承是面向對象編程的一個重要的方式,通過繼承,子類就可以擴展父類的功能。在python中一個類能繼承自不止一個父類,這叫做python的多重繼承(Multiple Inheritance )。
語法
class SubclassName(BaseClass1, BaseClass2, BaseClass3, ...): pass
在多層繼承和多繼承同時使用的情況下,就會出現復雜的繼承關系,多重多繼承。
其中,就會出現菱形繼承。如下圖所示。
在這種結構中,在調用順序上就出現了疑惑,調用順序究竟是以下哪一種順序呢
下面我們來解答下這個問題。
舉個例子來看下:
class A(): def __init__(self): print('init A...') print('end A...') class B(A): def __init__(self): print('init B...') A.__init__(self) print('end B...') class C(A): def __init__(self): print('init C...') A.__init__(self) print('end C...') class D(B, C): def __init__(self): print('init D...') B.__init__(self) C.__init__(self) print('end D...') if __name__ == '__main__': D()
輸出結果
init D... init B... init A... end A... end B... init C... init A... end A... end C... end D...
從輸出結果中看,調用順序為:D->B->A->C->A。可以看到,B、C共同繼承于A,A被調用了兩次。A沒必要重復調用兩次。
其實,上面問題的根源都跟MRO有關,MRO(Method Resolution Order)也叫方法解析順序,主要用于在多重繼承時判斷調的屬性來自于哪個類,其使用了一種叫做C3的算法,其基本思想時在避免同一類被調用多次的前提下,使用廣度優先和從左到右的原則去尋找需要的屬性和方法。
那么如何避免頂層父類中的某個方法被多次調用呢,此時就需要super()來發揮作用了,super本質上是一個類,內部記錄著MRO信息,由于C3算法確保同一個類只會被搜尋一次,這樣就避免了頂層父類中的方法被多次執行了,上面代碼可以改為:
class A(): def __init__(self): print('init A...') print('end A...') class B(A): def __init__(self): print('init B...') super(B, self).__init__() print('end B...') class C(A): def __init__(self): print('init C...') super(C, self).__init__() print('end C...') class D(B, C): def __init__(self): print('init D...') super(D, self).__init__() print('end D...') if __name__ == '__main__': D()
輸出結果:
init D... init B... init C... init A... end A... end C... end B... end D...
可以看出,此時的調用順序是D->B->C->A。即采用是廣度優先的遍歷方式。
Python類分為兩種,一種叫經典類,一種叫新式類。都支持多繼承,但繼承順序不同。
Python2.x中類的是有經典類和新式類兩種。Python3.x中都是新式類。
關于關于Python多重繼承中的菱形繼承介紹就分享到這里了,希望以上內容可以對大家有一定的參考價值,可以學以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。
當前文章:關于Python多重繼承中的菱形繼承介紹
網頁URL:http://vcdvsql.cn/article20/pdchco.html
成都網站建設公司_創新互聯,為您提供軟件開發、移動網站建設、ChatGPT、定制開發、服務器托管、靜態網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯