1. 程式人生 > 其它 >Python中mro繼承順序查詢之C3演算法

Python中mro繼承順序查詢之C3演算法

1. mro遍歷順序

  1. python中存在多繼承:A同時繼承B和C,B繼承E,C繼承F,E和F最終繼承object,如果我們訪問A的例項物件的屬性,他的查詢方法遵循C3演算法,(之前是深度優先查詢,一條路走到底)

    深度優先演算法:

    

2. C3演算法

  1. 公式:mro(A) = [A] + merge(mro(B),mro(C),[B,C])

  2. merge的意思是合併,如果一個序列的第一個元素,是其他序列中的第一個元素,或不在其他序列出現,則從所有執行merge操作序列中刪除這個元素,合併到當前的mro中。merge操作後的序列,繼續執行merge操作,直到merge操作的序列為空。如果merge操作的序列無法為空,則說明不合法。

以例項程式碼為例:
        第一步:mro(A) = [A] + merge([B,E,O],[C,F,O],[B,C]),看merge中第一個序列的第一個元素B,不存在其他序列的第二個元素起,合併進列表
        第二步:mro(A) = [A,B] + merge(E,O],[C,F,O],[C]),看merge中第一個序列的第一個元素E,不存在其他序列的第二個元素起,合併進列表
        第三步:mro(A) = [A,B,E] + merge([O],[C,F,O],[C]),看merge中第一個序列的第一個元素O,存在其他序列的第二個元素起,跳過
        第四步:mro(A) = [A,B,E] + merge([O],[C,F,O],[C]),看merge中第二個序列的第一個元素C,不存在其他序列的第二個元素起,合併進列表
        第五步:mro(A) = [A,B,E] + merge([O],[F,O],[C]),看merge中第一個序列的第一個元素O,存在其他序列的第二個元素起,跳過
        第六步:mro(A) = [A,B,E,C] + merge([O],[F,O],[]),看merge中第二個序列的第一個元素F,不存在其他序列的第二個元素起,合併進列表
        第七步:mro(A) = [A,B,E,C,F] + merge([O],[O],[]),看merge中第一個序列的第一個元素O,不存在其他序列的第二個元素起,合併進列表
        第八步:mro(A) = [A,B,E,C,F,O],通過C3演算法得到遍歷順序

  
# 程式碼展示
class
E: pass class F: pass class B(E): pass class C(F): pass class A(B,C): pass
# [
<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.F'>, <class 'object'>] print(A.mro()) print(B.mro()) # [
<class '__main__.B'>, <class '__main__.E'>, <class 'object'>] print(C.mro()) # [<class '__main__.C'>, <class '__main__.F'>, <class 'object'>]