Python中多層繼承的實現(xiàn)示例
繼承是面向?qū)ο缶幊讨械囊环N特性,通過該特性,類可以繼承另一個類的屬性和方法。在 Python 中,你可以實現(xiàn)不同類型的繼承,比如單繼承、多繼承和多層繼承。本章將介紹如何在 Python 中實現(xiàn)多層繼承。
多層繼承是一種層級繼承,使得一個派生類繼承另一個派生類。也就是說,一個類是由另一個類推導出來的。這形成了一條繼承鏈。
鏈頂端的類稱為基類或父類,中間的類稱為派生類或子類,鏈的最底層稱為子派生類或子類。
以下圖示展示了多層繼承的概念 −

Python 中多層繼承的示例
讓我們來看一個例子,以理解 Python 中多層繼承的工作原理 −
# Base class
class Network:
def connectivity(self):
return "Network connects"
# Derived class
class Network_5G(Network):
def fast_connectivity(self):
return "5G Network provides superfast connectivity"
# Sub-derived class
class Network_5G_Airtel(Network_5G):
def fast_and_stable_connectivity(self):
return "Airtel 5G network is fast and remains stable"
# Creating an instance of Network_5G_Airtel
network_object = Network_5G_Airtel()
print(network_object.connectivity()) # Inherited from Network class
print(network_object.fast_connectivity()) # Inherited from Network_5G class
print(network_object.fast_and_stable_connectivity()) # Inherited from Network_5G_Airtel class在該代碼中,Network_5G_Airtel類繼承了Network_5G類的函數(shù)和屬性,類又繼承了網(wǎng)絡(luò)類。因此,Network_5G_Airtel將可以使用諸如連接()(來自網(wǎng)絡(luò))、(fast_connectivity()(來自Network_5G)和fast_and_stable_connectivity()(來自Network_5G_Airtel自身)等方法。
當你運行該代碼時,其輸出將是 −
Network connects
5G Network provides superfast connectivity
Airtel 5G network is fast and remains stable
Python 中多層繼承的 MRO
我們考慮上述示例中的一個情景,其中Network_5G類也有一個名為 connectivity()的方法。那么,如果我們從 Network_5G_Airtel 類實例調(diào)用 connectivity() 方法,會發(fā)生什么?這正是方法解析令(MRO)發(fā)揮作用的地方。
我們修改前例,在Network_5G類中加入一個connectivity()方法。
# Base class
class Network:
def connectivity(self):
return "Network connects"
# Derived class
class Network_5G(Network):
def fast_connectivity(self):
return "5G Network provides superfast connectivity"
def connectivity(self):
return "5G Network connects faster"
# Sub-derived class
class Network_5G_Airtel(Network_5G):
def fast_and_stable_connectivity(self):
return "Airtel 5G network is fast and remains stable"
# Creating an instance of Network_5G_Airtel
obj1 = Network_5G_Airtel()
print(obj1.connectivity()) # Inherited from Network class上述代碼的輸出為−
5G Network connects faster
這表明調(diào)用的是Network_5G類的 connectivity() 方法,而非網(wǎng)絡(luò)類的。這是因為 Python 的方法解析順序(MRO)采用深度優(yōu)先方法,先在當前類中查找該方法,然后在父類中查找,依此類推。
要知道任何類的方法解析順序,可以使用mro()方法。以下是你可以這樣做的方法:
print(Network_5G_Airtel.mro()) Output: [<class '__main__.Network_5G_Airtel'>, <class '__main__.Network_5G'>, <class '__main__.Network'>, <class 'object'>]
多層繼承中的覆蓋方法
在多層繼承中,派生類可以覆蓋其父類的方法。也就是說,如果一個方法在父類和子類中都定義了,那么子類中的方法將覆蓋父類的方法。
這里有一個例子,說明多層繼承中方法覆蓋 −
# Base class
class Vehicle:
def start(self):
return "Vehicle starts"
# Derived class
class Car(Vehicle):
def start(self):
return "Car starts"
# Sub-derived class
class SportsCar(Car):
def start(self):
return "Sports Car starts"
# Creating an instance of SportsCar
sports_car = SportsCar()
print(sports_car.start()) # Calls the start method of SportsCar class上述代碼的輸出為−
Sports Car starts
多層繼承的最佳實踐
- 保持繼承鏈簡潔:盡量控制繼承層級(建議不超過 3 層),層級過多會導致代碼邏輯混亂,難以調(diào)試。
- 用 super () 代替手動指定父類:尤其是初始化方法,
super()能適配 MRO 順序,避免因繼承鏈調(diào)整導致的錯誤。 - 避免多層重寫混亂:如果需要重寫上層方法,建議在方法內(nèi)先用
super()調(diào)用上層方法,再添加自己的邏輯(保持繼承鏈的完整性):
class Child(Parent):
def common_method(self):
super().common_method() # 先執(zhí)行父類的方法
print("再添加子類自己的邏輯")結(jié)論
- 多層繼承是 “縱向” 的繼承鏈(子類→父類→祖父類),子類會繼承所有上層類的屬性和方法。
- 方法 / 屬性查找遵循就近原則(沿 MRO 向上找第一個匹配項),子類重寫會覆蓋上層類的同名方法。
super()是多層繼承的核心工具,能自動沿 MRO 調(diào)用上層類的方法,優(yōu)先使用super()而非手動指定父類名,提升代碼靈活性。
總之,多層繼承是一種繼承類型,其中一個類從另一個衍生類推導出來,形成一條繼承鏈。方法解析順序(MRO)將決定當繼承鏈中存在同名方法時,調(diào)用哪種方法。方法覆蓋可以通過覆蓋子類中父類的方法。
到此這篇關(guān)于Python中多層繼承的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Python 多層繼承內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
opencv實現(xiàn)靜態(tài)手勢識別 opencv實現(xiàn)剪刀石頭布游戲
這篇文章主要為大家詳細介紹了opencv實現(xiàn)靜態(tài)手勢識別,opencv實現(xiàn)剪刀石頭布游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01
windows下python虛擬環(huán)境virtualenv安裝和使用詳解
這篇文章主要介紹了windows下python虛擬環(huán)境virtualenv安裝和使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-07-07
Python插件virtualenv搭建虛擬環(huán)境
這篇文章主要為大家詳細介紹了Python插件virtualenv搭建虛擬環(huán)境,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
python中使用iterrows()對dataframe進行遍歷的實例
今天小編就為大家分享一篇python中使用iterrows()對dataframe進行遍歷的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06
關(guān)于TensorBoard可視化不顯示數(shù)據(jù)問題No scalar data was&nbs
這篇文章主要介紹了如何解決TensorBoard可視化不顯示數(shù)據(jù)問題No scalar data was found,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09

