在本文中,您將學習什么是Python中的多重繼承以及如何在程序中使用它。 您還將了解多級繼承和方法解析順序。
像C ++一樣,一個類可以從Python中的多個基類派生。這稱為多重繼承。
在多重繼承中,所有基類的功能都繼承到派生類中。多重繼承的語法類似于單一繼承。
class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass
在這里,MultiDerived源自類Base1和Base2。
MultiDerived類從Base1和Base2繼承。
另一方面,我們也可以繼承派生類。這稱為多級繼承。在Python中可以是任何深度。
在多級繼承中,基類和派生類的功能被繼承到新的派生類中。
下面給出了具有相應可視化效果的示例。
class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass
在此,Derived1從Base派生,Derived2從Derived1派生。
Python中的每個類都派生自該類object。它是Python中最基本的類型。
因此,從技術上講,所有其他類(內置的或用戶定義的)都是派生類,而所有對象都是object類的示例。
# 輸出: True print(issubclass(list,object)) # 輸出: True print(isinstance(5.5,object)) # 輸出: True print(isinstance("Hello",object))
在多繼承方案中,將在當前類中首先搜索任何指定的屬性。如果未找到,則搜索將以深度優(yōu)先,從左到右的方式繼續(xù)進入父類,而無需兩次搜索相同的類。
所以,在上面的實例中MultiDerived類中的搜索順序是[ MultiDerived,Base1,Base2,object]。該順序也稱為MultiDerived類的線性化,用于查找該順序的規(guī)則集稱為“ 方法解析順序(MRO)”。
MRO必須防止本地優(yōu)先級排序,并且還必須提供單調性。它可以確保一個類始終出現(xiàn)在其父級之前,如果有多個父級,則其順序與基類的元組相同。
可以將類的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'>]
這是一個稍微復雜的多重繼承示例及其可視化以及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 # 輸出: # [<class '__main__.M'>, <class '__main__.B'>, # <class '__main__.A'>, <class '__main__.X'>, # <class '__main__.Y'>, <class '__main__.Z'>, # <class 'object'>] print(M.mro())
請參考此內容,以進一步討論MRO,并了解實際算法的計算方式。