Python多重繼承
在本文中,您將瞭解Python中的多重繼承以及如何在程序中使用它。還將瞭解多級繼承和方法解析順序。
與C++一樣,一個類可以從Python中的多個基類派生出來。這被稱爲多重繼承。
在多重繼承中,所有基類的特徵都被繼承到派生類中。多重繼承的語法類似於單繼承。
Python多重繼承示例
class Base1:
pass
class Base2:
pass
class MultiDerived(Base1, Base2):
pass
這裏,MultiDerived
派生自Base1
和Base2
類。
MultiDerived
類從Base1
和Base2
繼承。
Python中的多層繼承
另一方面,我們也可以繼承一個派生類的形式。這被稱爲多級繼承。 它可以在Python中有任何的深度(層級)。在多級繼承中,基類和派生類的特性被繼承到新的派生類中。
下面給出了具有相應可視化的示例。
class Base:
pass
class Derived1(Base):
pass
class Derived2(Derived1):
pass
這裏,Derived1
派生自Base
,Derived2
派生自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並瞭解實際算法如何計算。