python多重繼承C3演算法

2021-08-30 02:50:37 字數 1682 閱讀 7489

python多重繼承的mro演算法選擇: 經典方式、python2.2 新式演算法、python2.3 新式演算法(c3)。python 3中只保留了最後一種,即c3演算法

c3演算法的解析:

1.多繼承uml圖:

備註:o==object

2.python-c3演算法解析:

#c3 定義引用開始

c3 演算法:mro是乙個有序列表l,在類被建立時就計算出來。

l(child(base1,base2)) = [ child + merge( l(base1) ,  l(base2) ,  base1base2 )]

l(object) = [ object ]

l的性質:結果為列表,列表中至少有乙個元素即類自己。

+        : 新增到列表的末尾,即 [ a + b ] = [ a,b ]

merge: ① 如果列表空則結束,非空 讀merge中第乙個列表的表頭,

② 檢視該表頭是否在 merge中所有列表的表尾中。

②-->③ 不在,則 放入 最終的l中,並從merge中的所有列表中刪除,然後 回到①中

②-->④ 在,檢視 當前列表是否是merge中的最後乙個列表

④-->⑤ 不是 ,跳過當前列表,讀merge中下乙個列表的表頭,然後 回到 ②中

④-->⑥ 是,異常。類定義失敗。 

表頭: 列表的第乙個元素 (列表:abc,那麼表頭就是a,b和c就是表尾)

表尾: 列表中表頭以外的元素集合(可以為空) 

merge 簡單的說即尋找合法表頭(也就是不在表尾中的表頭),如果所有表中都未找到合法表頭則異常。

#c3定義引用結束

例如:l(d) = l(d(o))

= d + merge(l(o))

= d + o

= [d,o]

l(b) = l(b(d,e))

= b + merge(l(d) , l(e))

= b + merge(do , eo) # 第乙個列表do的表頭d,其他列表比如eo的表尾都不含有d,所以可以將d提出來,即d是合法表頭

= b + d + merge(o , eo) #從第乙個開始表頭是o,但是後面的列表eo的表尾中含有o所以o是不合法的,所以跳到下乙個列表eo

= b + d + e + merge(o , o)

= [b,d,e,o]

同理:l(c) = [c,e,f,o]

l(a(b,c)) = a + merge(l(b),l(c),bc)

= a + merge(bdeo,cefo,bc)#b是合法表頭

= a + b + merge(deo,cefo,c)#d是合法表頭

= a + b + d + merge(eo,cefo,c)#e不是合法表頭,跳到下乙個列表cefo,此時c是合法表頭

= a + b + d + c + merge(eo,efo)#由於第三個列表中的c被刪除,為空,所以不存在第三個表,只剩下兩個表;此時e是合法表頭

= a + b + d + c + e + merge(o,fo)#o不是合法表頭,跳到下乙個列表fo,f是合法表頭,

= a + b + d + c + e + f + merge(o,o)#o是合法表頭

= a + b + d + c + e + f + o

= [a,b,d,c,e,f,o]

獲取c3的陣列列表,可以梳理清楚子類執行過程中向上執行的順序

Python多重繼承順序 C3演算法

本地優先順序 指宣告時父類的順序,比如c a,b 如果訪問c類物件屬性時,應該根據宣告順序,優先查詢a類,然後再查詢b類。單調性 如果在c的解析順序中,a排在b的前面,那麼在c的所有子類裡,也必須滿足這個順序。乙個類的c3線性表,是由兩部分進行merge操作得到的,第一部分是是它所有父類的c3線性表...

Python3多重繼承排序原理(C3演算法)

參考 類c的線性化記憶為l c c1,c2,cn 其中c1稱為l c 的頭,其餘元素 c2,cn 稱為尾。如果乙個類c繼承自基類b1,b2,b那麼l c 的計算過程為 類object為最高父類,所有類都繼承object l objicet object l c b1,b2,bn c merge l ...

Python多繼承C3演算法

python3 多繼承的mro演算法選擇。mro method resolution order 方法解析順序。python3 只保留了c3演算法!c3演算法解析 1.c3演算法解析 c3演算法 mro是乙個有序列表l,在類被建立時就計算出來了。l child base1,base2 child m...