例一
按照深度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 ...