python也具有多繼承的功能,而同樣的,大家能想到多繼承必須要引入一些特定的方法來準確調用子類或基類的重載、重寫的方法,否則會出現混亂。
本文參考Multiple inheritance in Python對該問題進行簡要論述。
如下圖描述了一個簡單的類繼承關係
下面是上面類圖的代碼,Class1、Class2、Class3都分別包含一個m方法,
class Class1:
def m(self):
print("In Class1")
class Class2(Class1):
def m(self):
print("In Class2")
class Class3(Class1):
def m(self):
print("In Class3")
class Class4(Class2, Class3):
def __init__(self):
super(Class4, self).m()
super(Class2, self).m()
super(Class3, self).m()
obj = Class4()
上面代碼的輸出結果爲:
In Class2
In Class3
In Class1
看出區別了嗎,區別就在於super中的第一個參數。python的多繼承通常來說是按順序繼承的,但也不盡然!
它的多繼承順序是依據一個叫做**Method Resolution Order (MRO)**的算法來決定的,通過使用類名.mro()
可以得到繼承關係的順序。
參考Python Multiple Inheritance中的一個例子
如下圖所示是一個比較複雜的繼承關係圖
其代碼編寫如下
# Demonstration of MRO
class X:
pass
class Y:
pass
class Z:
pass
class A(X, Y):
pass
class B(Y, Z):
pass
class M(B, A, Z):
pass
print(M.mro())
而其輸出結果爲:
[<class '__main__.M'>, <class '__main__.B'>,
<class '__main__.A'>, <class '__main__.X'>,
<class '__main__.Y'>, <class '__main__.Z'>,
<class 'object'>]
在實際情況中,不可避免地會遇見這種比較複雜的繼承關係,而要弄清楚它們的繼承順序似乎很是麻煩也容易出錯,那麼有沒有辦法直接指定調用某個基類的方法呢?
這當然是可以的。
class Class1:
def m(self):
print("In Class1")
class Class2(Class1):
def m(self):
print("In Class2")
class Class3(Class1):
def m(self):
print("In Class3")
class Class4(Class2, Class3):
def __init__(self):
Class1.m(self)
Class2.m(self)
Class3.m(self)
obj = Class4()
輸出結果爲:
In Class1
In Class2
In Class3
即,只需指定繼承的類名,傳入子類對象,即可調用任意指定基類的方法啦!