Python基础教程:菱形继承问题
生活随笔
收集整理的這篇文章主要介紹了
Python基础教程:菱形继承问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、類的分類
1.1 新式類
- 繼承了object的類以及該類的子類,都是新式類
- Python3中所有的類都是新式類
1.2 經典類
- 沒有繼承object的類以及該類的子類,都是經典類
- 只有Python2中才有經典類
二、菱形繼承問題
在Java和C#中子類只能繼承一個父類,而Python中子類可以同時繼承多個父類,如A(B,C,D)
如果繼承關系為非菱形結構,則會按照先找B這一條分支,然后再找C這一條分支,最后找D這一條分支的順序直到找到我們想要的屬性
如果繼承關系為菱形結構,即子類的父類最后繼承了同一個類,那么屬性的查找方式有兩種:
- 經典類下:深度優先
- 廣度優先:廣度優先
- 經典類:一條路走到黑,深度優先
- 新式類:不找多各類最后繼承的同一個類,直接去找下一個父類,廣度優先
三、C3算法與mro()方法介紹
python到底是如何實現繼承的,對于你定義的每一個類,python會計算出一個方法解析順序(MRO)列表,這個MRO列表就是一個簡單的所有基類的線性順序列表,如:
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 . 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' print(A.mro()) # A.__mro__ [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.F'>, <class '__main__.D'>, <class '__main__.G'>, <class 'object'>] for i in A.mro():print(i) <class '__main__.A'> <class '__main__.B'> <class '__main__.E'> <class '__main__.C'> <class '__main__.F'> <class '__main__.D'> <class '__main__.G'> <class 'object'>為了實現繼承,python會在MRO列表上從左到右開始查找基類,直到找到第一個匹配這個屬性的類為止。
而這個MRO列表的構造是通過一個C3線性化算法來實現的。我們不去深究這個算法的數學原理,它實際上就是合并所有父類的MRO列表并遵循如下三條準則:
總結
以上是生活随笔為你收集整理的Python基础教程:菱形继承问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python面向对象之定制对象独有特征
- 下一篇: Python基础教程:类的propert