歷史
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...