溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python多繼承廣度優(yōu)先C3算法原理是什么

發(fā)布時間:2021-11-25 09:42:14 來源:億速云 閱讀:195 作者:iii 欄目:互聯(lián)網科技

這篇文章主要介紹“python多繼承廣度優(yōu)先C3算法原理是什么”,在日常操作中,相信很多人在python多繼承廣度優(yōu)先C3算法原理是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”python多繼承廣度優(yōu)先C3算法原理是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

python多繼承比較復雜,python2的多繼承查找順序是深度優(yōu)先,pyhon3的多繼承查找順序是采取C3算法的廣度優(yōu)先。

C3算法原理:

  1. python解釋器每遇到一個類就會按廣度優(yōu)先的原則將其父類的繼承序列依次添加進它的本序列。

  2. 首先將自身類加入本序列,然后對繼承序列的元素依次判斷。

  3. 若某元素不在其他序列或者它是所有繼承序列的第一個,那么把這個元素提取到本序列。

  4. 若該元素不符合第3步,則跳過它尋找下一個元素繼續(xù)進行第3步操作。

  5. 循環(huán)執(zhí)行3-4步驟,直至繼承序列的所有元素都被提取到本序列。

案例:

python多繼承廣度優(yōu)先C3算法原理是什么

代碼:

class F:print('F')class G:print('G')class D(F):print('D')class E(G):print('E')class B(D, E):print('B')class C(E):print('C')class A(B, C):print('A')

講解:

解釋器每遇到一個類就會按C3算法廣度優(yōu)先的原則將其父類的繼承序列依次添加進它的本序列。

一、F類 [F,O]。

二、G類 [G,O]。

三、D類 [D] + F類 [F,O],單繼承:[DFO]。

四、E類 [E] + G類 [G,O],單繼承:[EGO]。

五、B類 [B] , D類 [DFO] + E類 [EGO]:
第一步,[DFO]的D不在其他序列,提取到本序列——[BD] , [FO] + [EGO];
第二步,[FO]的F不在其他序列,提取到本序列——[BDF] , [O] + [EGO];
第三步,[O]的O在其他序列且不是第一個,跳過它向后找——[BDF] , [O] + [EGO];
第四步,[EGO]的E不在其他序列,提取到本序列——[BDFE] , [O] + [GO];
第五步,[GO]的G不在其他序列,提取到本序列——[BDFEG] , [O] + [O];
第六步,[O]的O是所有繼承序列的第一個,提取放入本序列——[BDFEGO] , [] + [];
第七步,所有繼承序列均為空,運算完成——[BDFEGO];
C3算法運算結果:[BDFEGO]。
六、C類 [C] + E類 [EGO],單繼承:[CEGO]。
七、A類 [A] , B類 [BDFEGO] + C類 [CEGO]:
第一步,[BDFEGO]的B不在其他序列,提取到本序列——[AB] , [DFEGO] + [CEGO];
第二步,[DFEGO]的D不在其他序列,提取到本序列——[ABD] , [FEGO] + [CEGO];
第三步,[FEGO]的F不在其他序列,提取到本序列——[ABDF] , [EGO] + [CEGO];
第四步,[EGO]的E在其他序列且不是第一個,跳過它向后找——[ABDF] , [EGO] + [CEGO];
第五步,[EGO]的G在其他序列且不是第一個,跳過它向后找——[ABDF] , [EGO] + [CEGO];
第六步,[EGO]的O在其他序列且不是第一個,跳過它向后找——[ABDF] , [EGO] + [CEGO];
第七步,[CEGO]的C不在其他序列,提取到本序列——[ABDFC] , [EGO] + [EGO];
第八步,[EGO]的E是所有繼承序列的第一個,提取放入本序列——[ABDFCE] , [GO] + [GO];
第九步,[GO]的G是所有繼承序列的第一個,提取放入本序列——[ABDFCEG] , [O] + [O];
第十步,[O]的O是所有繼承序列的第一個,提取放入本序列——[ABDFCEGO] , [] + [];
第十一步,除了本序列外,其他序列均為空,運算完成——[ABDFCEGO];
C3算法運算結果:[ABDFCEGO]。

測試代碼

C3算法的廣度優(yōu)先有點復雜,比較難懂,python3為此提供了簡便的查詢函數 —— 類名.mro() 。

print(A.mro())out:[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.F'>, <class '__main__.C'>, <class '__main__.E'>, <class '__main__.G'>, <class 'object'>]

可以看到A.mro()打印的結果和上述推理的運算結果ABDFCEGO一致。

到此,關于“python多繼承廣度優(yōu)先C3算法原理是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI