1. 程式人生 > >python多重繼承C3演算法

python多重繼承C3演算法

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的陣列列表,可以梳理清楚子類執行過程中向上執行的順序