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

python多繼承之C3演算法

python多繼承的MRO演算法之C3演算法. C3演算法的解析:

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