面向物件【林老師版】:繼承的原理(五)
阿新 • • 發佈:2018-11-06
一、經典類
經典類:沒有繼承object的類,以及它的子類都稱之為經典類
1、python2.x
在python2中-》經典類:沒有繼承object的類,以及它的子類都稱之為經典類
class Foo: pass class Bar(Foo): pass
二、新式類
1、python2.x
class Foo(object): pass class Bar(Foo): pass
在python2中-》新式類:繼承object的類,以及它的子類都稱之為新式類
2、python3.x
1、程式碼
class Foo(): pass print(Foo.__bases__)
2、輸出
(<class 'object'>,)
3、加上object
class Foo(object): pass print(Foo.__bases__)
4、輸出
(<class 'object'>,)
在python3中-》新式類:一個類沒有繼承object類,預設就繼承object
三、python到底是如何實現繼承的
python到底是如何實現繼承的,對於你定義的每一個類,python會計算出一個方法解析順序(MRO)列表,這個MRO列表就是一個簡單的所有基類的線性順序列表,例如
>>> F.mro() #等同於F.__mro__ [<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
為了實現繼承,python會在MRO列表上從左到右開始查詢基類,直到找到第一個匹配這個屬性的類為止。而這個MRO列表的構造是通過一個C3線性化演算法來實現的。我們不去深究這個演算法的數學原理,它實際上就是合併所有父類的MRO列表並遵循如下三條準則:
- 子類會先於父類被檢查
- 多個父類會根據它們在列表中的順序被檢查
- 如果對下一個類存在兩個合法的選擇,選擇第一個父類
在Java和C#中子類只能繼承一個父類,而Python中子類可以同時繼承多個父類,如果繼承了多個父類,那麼屬性的查詢方式有兩種,分別是:深度優先和廣度優先
四、當類是經典類時