python的多繼承C3 mro 演算法

2022-07-17 09:36:13 字數 1795 閱讀 1948

例一

按照深度a類從左往右有三條可繼承的"路"

先按照深度優先的演算法,將每一路的每乙個節點加到列表中

b = [b,d,f,h]

c = [c,e,g,h]

d = [d,f,h]

a = [b,c,d]  a的廣度順序

得到四個列表,四個列表按照頭尾的方式進行比較,如何劃分頭尾呢.

第乙個為頭,剩下的都是尾,

比較第乙個列表的頭是都在其他列表中的尾部出現,如果出現,則跳過這個列表,直接到下乙個列表的頭部,再次判斷是否出現在其他列表的尾部,如果都沒有出現就將這個元素放進乙個新的列表,

然後把所有列表中的這個元素刪除,以此類推,直到把所有的列表刪除為空,得出的新列表就是繼承的順序.

過程:

1   [b,d,f,h]  [c,e,g,h]  [d,f,h]  [b,c,d]	new_list[b,]

第一次比較b,所有列表的尾部沒有b,新增b到新列表,然後刪除所有的頭部b

2 [d,f,h] [c,e,g,h] [d,f,h] [c,d] new_list[b,]

比較頭部d,d在其他的尾部中存在,跳過這次比較,直接進入下乙個列表比較c

3 [d,f,h] [e,g,h] [d,f,h] [d] new_list[b,c]

c在其他列表的尾部不存在,將c新增至新列表,刪除所有的頭部c

4 [f,h] [e,g,h] [f,h] new_list[b,c,d]

再次回到第乙個列表比較d,d沒有存在其他列表的尾部新增d到新列表,然後刪除所有的頭部d

5 [h] [e,g,h] [h] new_list[b,c,d,f]

6 [h] [g,h] [h] new_list[b,c,d,f,e]

7 [h] [h] [h] new_list[b,c,d,f,e,g]

8 new_list[b,c,d,f,e,g,h]

所以最後的繼承順序就是a,b,c,d,f,e,g,h,object

例二

流程:因為有多個分叉,所以需要先計算每乙個分叉的mro順序:

從最左邊的最高杈開始計算它的mro

分叉b:[b] [b,e](父類的, 按照深度優先) [b,d](自己繼承的按照廣度優先)

計算結果:[b,e,d]

分叉c:[c] [c,d] [c,f]

計算結果:[c,d,f]

計算完上面的兩個叉後,就變成了乙個叉.

再次進行計算:

[a] [b, e, d] [c, d, f] [b, c]  new_list[a,]

[e, d] [c, d, f] [c]  new_list[a,b,]

[d] [c, d, f] [c]  new_list[a,b,e,]

[d] [d, f]   new_list[a,b,e,c,]

[f]   new_list[a,b,e,c,d,]

new_list[a,b,e,c,d,f]

所以最後的繼承順序就是a,b,e,c,d,f,object

Python 多繼承中MRO順序

在python3 裡面,使用super當有多繼承的情況出現的時候,有時候會出現呼叫父類init呼叫不到,因為在python3 裡面有乙個預設來處理類之間呼叫順序的c3 演算法,c3用來保證每個類只呼叫一次的演算法,所有通過super 來進行呼叫的時候都會根據裡面的順序來進行呼叫 在類中可以通過 cl...

python中的多繼承以及MRO

mro即method resolution order,方法呼叫順序。python是一門支援多繼承的語言,當乙個子類 該子類繼承了兩個父類 的物件執行方法a時,該子類沒有定義方法a,而兩個父類都定義了方法a,那麼應該執行哪個父類的方法a?這個時候就需要mro來制定執行順序。看個例子 classf p...

多繼承的MRO問題

class a def go self print a class b a defgo self print b super go c 已經被更改了繼承關係 class c a defgo self print c super go a class d b,c defgo self print d ...