Python多繼承C3演算法

2022-06-16 17:51:12 字數 2267 閱讀 3315

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.例子

= b + merge(do , eo) # 第乙個列表do的表頭d,其他列表比如eo的表尾都不含有d,所以可以將d提出來,即d是合法表頭

= b + d + merge(o , eo) #從第乙個開始表頭是o,但是後面的列表eo的表尾中含有o所以o是不合法的,所以跳到下乙個列表eo

= 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是合法表頭

多繼承c3演算法

一.mro mro即 method resolution order 方法解釋順序 主要用於在多繼承時判斷屬性的路徑 來自於哪個類 print 類.mro 得到屬性路徑按繼承順序 在python2.2版本中,演算法基本思想是根據每個祖先類的繼承結構,編譯出一張列表,包括搜尋到的類,按策略刪除重複的。...

python多繼承之C3演算法

mro即 method resolution order 方法解釋順序 主要用於在多繼承時判斷屬性的路徑 來自於哪個類 在python2.2版本中,演算法基本思想是根據每個祖先類的繼承結構,編譯出一張列表,包括搜尋到的類,按策略刪除重複的。但是,在維護單調性方面失敗過 順序儲存 所以從2.3版本,採...

python多重繼承C3演算法

python多重繼承的mro演算法選擇 經典方式 python2.2 新式演算法 python2.3 新式演算法 c3 python 3中只保留了最後一種,即c3演算法 c3演算法的解析 1.多繼承uml圖 備註 o object 2.python c3演算法解析 c3 定義引用開始 c3 演算法 ...