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'>]