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...