一直用python都是拿着cookbook和庫的文檔直接擼,不多會把細節過得那麼完全,遇到問題纔會翻文檔。python
今天看到這個例子的時候我忽然觸及了個人盲區,我不肯定這樣的繼承層級調用super.foo()會先綁定哪一個。由於以前我寫的庫的類層級並不會這樣,因此沒有去考究。函數
既然遇到問題,就要去弄明白、去解決這個問題。看了官方的文檔,python在多繼承的狀況下,會先將父類的繼承鏈路所有放進一個list裏面,而後再進行合併,再函數綁定的時候,左前到後遇到第一個匹配的時候直接綁定。spa
下面po出代碼。code
class A:
def foo(self):
print("A")
class B(A):
def foo(self):
super(B, self).foo()
print("B")
class C(B, A):
def foo(self):
super(C, self).foo()
print("C")
class D(C):
def foo(self):
super(D, self).foo()
print("D")
class E(D, C):
pass
a = A()
b = B()
c = C()
d = D()
e = E()
a.foo()
print(" ")
b.foo()
print(" ")
c.foo()
print(" ")
d.foo()
print(" ")
e.foo()
答案:blog
根據文檔的計算方法繼承
L(A) = O文檔
L(B) = B A Oget
L(C) = C merge(BAO,AO,BA) = C B A Oit
L(D) = D C B A Oclass
L(E) = E + merge(DCBAO,CBAO,DC) = E D C B A O
因此super(type,self).foo()綁定的方法實例就會按照上面的解來得出。