python mro演算法 python的MRO演算法

2021-10-11 22:34:09 字數 787 閱讀 4680

歷史

python2.1 經典類 dfs(深度優先遍歷)

python2.2 引入新式類,經典類 dfs,新式類 bfs(廣度優先遍歷)

python2.3-2.7 經典類 dfs,新式類 c3

python3 新式類 c3

u型繼承和菱形繼承

u型繼承

對於dfs演算法,mro(方法解析順序)為:caxby,最終拿到x的hello方法,沒有問題

對於bfs演算法,mro為:cabxy,最終拿到b的hello方法,有問題

菱形繼承

對於dfs演算法,mro(方法解析順序)為:caxb,最終拿到x的hello方法,有問題

對於bfs演算法,mro為:cabx,最終拿到b的hello方法,沒有問題

c3線性化演算法

dfs和bfs都不能同時解決u型繼承和菱形繼承兩種模式,如果想要解決,那就需要在現有演算法基礎上加以改造

c3演算法在dfs深度遍歷基礎上增加了一步:刪除壞的節點

什麼是好的節點?什麼是壞的節點?

當搜尋路徑中n節點之後的節點都不繼承n,則n節點為好的節點,否則為壞的節點

比如對於菱形繼承,dfs之後得到搜尋路徑為caxbx,由於x節點被後面的b節點繼承,x節點為壞的節點,所以刪除x節點,得到mro順序為cabx

區分搜尋路徑和mro順序:

上面的mro順序是在搜尋路徑的基礎上刪除了重複節點,比如菱形繼承dfs得到的搜尋路徑為caxbx,刪除x得到mro為:caxb

總結c3演算法在dfs基礎上(dfs滿足u型繼承)做了擴充套件,從而同時解決了u型繼承和菱形繼承兩個問題。

python mro檔案 python MRO問題

c3演算法解決例項訪問屬性和方法的解析順序問題,核心是merge。2.以前python版本採用深度優先演算法。c3演算法是這樣子的 在merge列表中,如果第乙個序列mro的第乙個類是出現在其它序列,並且也是第乙個,或者不出現其它序列,那麼這個類就會從這些序列中刪除,並合到訪問順序列表中。例子 cl...

05 Python MRO及c3演算法

1.了解python2和python3類的區別 python2在2.3之前使用的是經典類,2.3之後,使用的是新式類 2.經典類的mro 樹形結構的深度優先遍歷 樹形結構遍歷 從左到右,深度遞迴,一直到頭再返回 foo h g d b a c e 3.新式類的mro c3演算法 拿第一項的第一位和 ...

python mro檔案 python的MRO方案

python 中的 class 分為 classical 和 new style 兩大類。其中 classical 是 python 一直沿用的,而 new style 是 2.2 才開始引入的東西。只要 class 繼承於 object,或 bases class 裡面任意乙個繼承於 object...