目錄python
繼承了object的類以及該類的子類,都是新式類算法
Python3中全部的類都是新式類3d
沒有繼承object的類以及該類的子類,都是經典類code
只有Python2中才有經典類blog
在Java和C#中子類只能繼承一個父類,而Python中子類能夠同時繼承多個父類,如A(B,C,D)繼承
若是繼承關係爲非菱形結構,則會按照先找B這一條分支,而後再找C這一條分支,最後找D這一條分支的順序直到找到咱們想要的屬性數學
若是繼承關係爲菱形結構,即子類的父類最後繼承了同一個類,那麼屬性的查找方式有兩種:it
廣度優先:廣度優先class
經典類:一條路走到黑,深度優先test
class G(object): # def test(self): # print('from G') pass print(G.__bases__) class E(G): # def test(self): # print('from E') pass class B(E): # def test(self): # print('from B') pass class F(G): # def test(self): # print('from F') pass class C(F): # def test(self): # print('from C') pass class D(G): # def test(self): # print('from D') pass class A(B, C, D): def test(self): print('from A') obj = A()
(<class 'object'>,)
obj.test() # A->B->E-C-F-D->G-object
from A
python究竟是如何實現繼承的,對於你定義的每個類,python會計算出一個方法解析順序(MRO)列表,這個MRO列表就是一個簡單的全部基類的線性順序列表,如:
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列表並遵循以下三條準則: