Python多繼承C3算法

Python3 多繼承的MRO算法選擇。MRO(Method Resolution Order):方法解析順序。
Python3 只保留了C3算法!

C3算法解析:

1.C3算法解析
C3算法:MRO是一個有序列表L,在類被建立時就計算出來了。
L(Child(Base1, Base2)) = [Child + merge(L(Base1), L(Base2), Base1Base2)]
L(object) = [object]
L的性質:結果爲列表,列表中至少有一個元素即類本身。
+	  :添加到列表的末尾,即[A + B] = [A, B]
merge :
1)若是列表爲空則結束,非空讀merge中第一個列表的表頭
2)查看該表頭是否在merge中全部列表的表尾中
2)-->3)不在,則放入最終的L中,並從merge中的全部列表中刪除,而後回到1)
2)-->4)在,查看當前列表是不是merge中的最後一個列表
4)-->5)不是,跳過當前列表,讀merge中下一個列表的表頭,而後回到2)
4)-->5)是,異常。類定義失敗。
須要瞭解一些詞的意思:
表頭:列表的第一個元素(列表:ABCD,那麼表頭就是A,B,C,D都是表尾)
表尾:列表中表頭覺得的元素集合(也能夠爲空)
merge 簡單的說就是尋找合法表頭(也就是不在表尾中的表頭),若是全部表中都未找到合法表頭則異常

2.例子
<1>
L(D) = L(D(O))
= D + merge(L(O))
= D + O
=[D, O]

class D:
    pass


print(D.mro())#[<class '__main__.D'>, <class 'object'>]
<2>
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]

class D:
    pass


class E:
    pass


class B(D, E):
    pass


print(B.mro())#[<class '__main__.B'>, <class '__main__.D'>, <class '__main__.E'>, <class 'object'>]
<3>
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]

class D:
    pass


class E:
    pass


class F:
    pass


class B(D, E):
    pass


class C(E, F):
    pass


class A(B, C):
    pass


print(A.mro())#[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.C'>, <class '__main__.E'>, <class '__main__.F'>, <class 'object'>]
相關文章
相關標籤/搜索