1. 程式人生 > >python3中多重繼承的問題

python3中多重繼承的問題

本來以為多重繼承很簡單,但是多看了一些資料後發現還是挺複雜的。
如果繼承情況簡單就還比較好理解,但是如果繼承的情況太過於複雜的話,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的前後關係,所以報錯。)