(本地優先順序:指宣告時父類的順序,比如c(a,b),如果訪問c類物件屬性時,應該根據宣告順序,優先查詢a類,然後再查詢b類。
單調性:如果在c的解析順序中,a排在b的前面,那麼在c的所有子類裡,也必須滿足這個順序。)
乙個類的c3線性表,是由兩部分進行merge操作得到的,第一部分是是它所有父類的c3線性表(parents' linearizations),第二部分是它所有父類組成的列表(parents list)。後者其實是區域性的優先順序列表。
l(child(base1,base2)) = [ child + merge( l(base1) , l(base2) , base1base2 )]所謂merge操作,遵循以下原則:表的首個元素不可以出現在其他地方,如果出現了這樣的情形,那麼就要將該元素全部移出,放到產出列表(output list)中。如果迴圈進行這一操作,就可以把所有的表逐步移出,逐步擴張產出表,最後得到乙個l(object) = [ object ]
純粹的產出表。這個產出表就是最後的c3線性表。
merge: ① 如果列表空則結束,非空 讀merge中第乙個列表的表頭,1.前趨圖。作為有向無環圖,找不到任何的迴圈,通常用前趨圖來理解程式的依賴關係。② 檢視該表頭是否在 merge中所有列表的表尾中。
②-->③ 不在,則 放入 最終的l中,並從merge中的所有列表中刪除,然後 回到①中
②-->④ 在,檢視 當前列表是否是merge中的最後乙個列表
④-->⑤ 不是 ,跳過當前列表,讀merge中下乙個列表的表頭,然後 回到 ②中
④-->⑥ 是,異常。類定義失敗。
表頭: 列表的第乙個元素 (列表:abc,那麼表頭就是a,b和c就是表尾)
表尾: 列表中表頭以外的元素集合(可以為空)
merge 簡單的說即尋找合法表頭(也就是不在表尾中的表頭),如果所有表中都未找到合法表頭則異常。
2.保持區域性的優先次序。
3.單調性。
舉個例子:
= 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)獲取c3的陣列列表,可以梳理清楚子類執行過程中向上執行的順序= 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]
python多重繼承C3演算法
python多重繼承的mro演算法選擇 經典方式 python2.2 新式演算法 python2.3 新式演算法 c3 python 3中只保留了最後一種,即c3演算法 c3演算法的解析 1.多繼承uml圖 備註 o object 2.python c3演算法解析 c3 定義引用開始 c3 演算法 ...
Python的多重繼承問題 MRO和C3演算法
有乙個sina的blog介紹的很好 python 多重繼承mro mro即method resolution order,主要用於在多繼承時判斷調的屬性的路徑 來自於哪個類 之前檢視了很多資料,說mro是基於深度優先搜尋演算法的。但不完全正確在python2.3之前是基於此演算法,但從python2...
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 ...