python3中多重繼承的問題
阿新 • • 發佈:2018-12-24
本來以為多重繼承很簡單,但是多看了一些資料後發現還是挺複雜的。
如果繼承情況簡單就還比較好理解,但是如果繼承的情況太過於複雜的話,python3
中會使用拓撲排序的方式來尋找繼承的父類。
有關繼承的拓撲排序
關於這方面看上面的文章就可以了。
我下面給出除此之外的一些說明
class A(object):
def f(self):
print('A')
class B(object):
def f(self):
print('B')
class C(A,B):
pass
s = C()
s.f()
#A
由上面程式碼的輸出可以看出,當前子類繼承多個父類的時候,對函式的繼承會優先選擇靠左邊的。
class A(object):
def f(self):
print('A')
class B(object):
def f(self):
print('B')
class C(A,B):
pass
class D(A,B):
def f(self):
print("D")
class E(C,D):
pass
s = E()
s.f()
#D
上面這段程式碼會輸出D,這個說明對於E來說它會先去看C,發現C沒有就去繼承D的。而並非是發現C沒有,從C繼承下來的最左邊A中找。
class A(object) :
def f(self):
print('A')
class B(object):
def f(self):
print('B')
class C(A,B):
pass
class D(A,B):
pass
class E(C,D):
pass
s = E()
s.f()
#A
上面這段沒啥好說的。我們下面看一段會報錯的繼承:
class A(object):
def f(self):
print('A')
class B(object):
def f(self):
print('B' )
class C(B,A):
pass
class D(A,B):
pass
class E(C,D):
pass
s = E()
s.f()
#TypeError: Cannot create a consistent method resolution
#order (MRO) for bases A, B
上面這種寫法會報錯。看了一些資料後發下了這段話:class E(C,D)這個類如果去掉的話也可以沒有錯誤,如果加上這個類後,按照這種寫法,會導致mro中無法在唯一確認類之間的關係,會導致繼承關係混亂。(按照我的理解,雖然是按照拓撲排序查詢父類,但是對於同一層的父類,他們之間的順序定義是按下一層的繼承寫法來定義的(從左到右)。上面這段程式碼,會使得在A,B這一層無法準確確定A與B的前後關係,所以報錯。)