Python類的多繼承的搜索順序
Python支持多繼承,而任何實現(xiàn)多繼承的語言都需要處理潛在的命名沖突,這種命名沖突是由不相關(guān)的祖先類實現(xiàn)同名方法引起,這種沖突就被稱為 菱形問題。
需要聲明的是,在 Python3 中多繼承的搜索順序為:從左至右,廣度優(yōu)先;Python2采用的多繼承搜索順序為:從左至右,深度優(yōu)先。
一、首先,先來看一下菱形問題
它的繼承關(guān)系、代碼實現(xiàn)和運(yùn)行結(jié)果如下圖所示:
class A: def show(self): print('---A---') class B(A): def fun(self): print('this is class B!') class C(A): def fun(self): print('this is class C!') class D(B, C): def show(self): super().show() #--->1 print('---D---') def test(self): self.show() #--->2 super().show() #--->3 self.fun() #--->4 super().fun() #--->5 C.fun(self) #---->6 C.show(self) #--->7 d = D() d.show() print('-----------------------------') d.test()
首先,創(chuàng)建D類的對象的d,然后調(diào)用其中的 show 方法,再調(diào)用 test 方法(以下序號在代碼中標(biāo)出):
1、調(diào)用 show 方法,由于類 D 實現(xiàn)了自己的 show 方法,則此時進(jìn)入 D 類的 show 方法,然后使用 super 方法調(diào)用了父類的 show方法,B、C類都沒有實現(xiàn)該方法,則繼續(xù)往上找,A 類中實現(xiàn)了 show 方法,則執(zhí)行該方法,再繼續(xù)向下執(zhí)行。
2、在 test 方法中首先調(diào)用了自己的 show 方法,則重復(fù)上一條的執(zhí)行順序。
3、此處調(diào)用父類的 show 方法,往上找A類中實現(xiàn)了 show 方法,則執(zhí)行該方法。
4、由于D類沒有 fun 方法,則根據(jù)搜索順序,B--->A,則執(zhí)行B類的 fun 方法。
5、調(diào)用父類的 fun 方法,搜索順序與上一條相同。
6、此處需要注意,直接在類上調(diào)用實例方法時,必須顯示的傳入?yún)?shù) self。
二、再來看一個例子,其繼承關(guān)系、代碼實現(xiàn)和運(yùn)行結(jié)果如下圖所示:
class A: pass class B: pass class C(A): pass class D(A): pass class E(B, C): pass class G1(C, B, D): pass class F1(D, B): pass class F2(C, D): pass class G2(C, D, B): pass class G3(D, B, C): pass print(C.__mro__) print(D.__mro__) print(E.__mro__) print(F1.__mro__) print(F2.__mro__) print(G1.__mro__) print(G2.__mro__) print(G3.__mro__)
在這里,首先需要介紹一個類的屬性 __mro__ ,它的返回值是一個元組,可按照方法解析順序(由于Python會按照特定的順序遍歷繼承圖,這個順序成為方法解析順序)列出各個超類,從當(dāng)前類一直向上,知道 object 類。為了更加深入的說明問題,在代碼實現(xiàn)時,增加了幾個不同的繼承關(guān)系。從以上代碼中,可以得出以下結(jié)論:
1、類的多繼承與繼承的順序有關(guān),按照從左到右的順序,依次搜索。
2、繼承采用從左到右,廣度優(yōu)先順序進(jìn)行搜索,例如類 F2。
3、同一級別的父類搜索完之后,才繼續(xù)向上一級搜索,例如類 G1、G2、G3。
4、所有的繼承搜索順序到達(dá) object 類停止。
到此這篇關(guān)于Python類的多繼承的搜索順序的文章就介紹到這了,更多相關(guān)Python類多繼承順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pandas 數(shù)據(jù)處理,數(shù)據(jù)清洗詳解
今天小編就為大家分享一篇Pandas 數(shù)據(jù)處理,數(shù)據(jù)清洗詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07python使用tcp實現(xiàn)局域網(wǎng)內(nèi)文件傳輸
這篇文章主要介紹了python使用tcp實現(xiàn)局域網(wǎng)內(nèi)文件傳輸,文件包括文本,圖片,視頻等,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07Pandas 解決dataframe的一列進(jìn)行向下順移問題
今天小編就為大家分享一篇Pandas 解決dataframe的一列進(jìn)行向下順移問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12