Python多重繼承


在本文中,您將了解Python中的多重繼承以及如何在程式中使用它。還將了解多級繼承和方法解析順序。

與C++一樣,一個類可以從Python中的多個基礎類別派生出來。這被稱為多重繼承。

在多重繼承中,所有基礎類別的特徵都被繼承到派生類中。多重繼承的語法類似於單繼承。

Python多重繼承範例

class Base1:
    pass

class Base2:
    pass

class MultiDerived(Base1, Base2):
    pass

這裡,MultiDerived派生自Base1Base2類。

MultiDerived類從Base1Base2繼承。

Python中的多層繼承

另一方面,我們也可以繼承一個派生類的形式。這被稱為多級繼承。 它可以在Python中有任何的深度(層級)。在多級繼承中,基礎類別和派生類的特性被繼承到新的派生類中。
下面給出了具有相應視覺化的範例。

class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass

這裡,Derived1派生自BaseDerived2派生自Derived1

Python中的方法解析順序

Python中的每個類都派生自類:object。它是Python中最基礎的型別。

所以在技術上,所有其他類,無論是內建還是使用者定義,都是派生類,所有物件都是物件類的範例。

# Output: True
print(issubclass(list,object))

# Output: True
print(isinstance(5.5,object))

# Output: True
print(isinstance("Hello",object))

在多繼承方案中,在當前類中首先搜尋任何指定的屬性。如果沒有找到,搜尋繼續進入父類別,深度優先,再到左右的方式,而不需要搜尋相同的類兩次。

所以在MultiDerived類的上面的例子中,搜尋順序是[MultiDerived,Base1,Base2,object]。 此順序也稱為MultiDerived類的線性化,用於查詢此順序的一組規則稱為方法解析順序(MRO)。

MRO必須防止本地優先排序,並提供單調性。它確保一個類總是出現在其父類別之前,並且在多個父類別的情況下,該順序與基礎類別的元組相同。

一個類的MRO可以被看作是__mro__屬性或者mro()方法。前者返回一個元組,而後者返回一個列表。

>>> MultiDerived.__mro__
(<class '__main__.MultiDerived'>,
 <class '__main__.Base1'>,
 <class '__main__.Base2'>,
 <class 'object'>)

>>> MultiDerived.mro()
[<class '__main__.MultiDerived'>,
 <class '__main__.Base1'>,
 <class '__main__.Base2'>,
 <class 'object'>]

這裡有一個更複雜的多重繼承範例及其視覺化圖型。

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

# Output:
# [<class '__main__.M'>, <class '__main__.B'>,
# <class '__main__.A'>, <class '__main__.X'>,
# <class '__main__.Y'>, <class '__main__.Z'>,
# <class 'object'>]

print(M.mro())

參考這一點,進一步討論MRO並了解實際演算法如何計算。