網站首頁 編程語言 正文
Python中單類繼承
Python是一門面向對象的編程語言,支持類繼承。
新的類稱為子類(Subclass),被繼承的類稱為父類、基類或者超類。子類繼承父類后,就擁有父類的所有特性。
類繼承的簡單例子:
普通類方法繼承
class Fruit():
? ? def color(self):
? ? ? ? print("colorful")
class Apple(Fruit):
? ? pass
class Orange(Fruit):
? ? pass
apple = Apple()
orange = Orange()
apple.color()
orange.color()
# 輸出
# colorful
# colorful
這里Fruit為父類,Apple和Orange為子類,子類繼承了父類的特性,因此Apple和Orange也擁有Color方法。
子類除了可以繼承父類的方法,還可以覆蓋父類的方法:
class Fruit():
? ? def color(self):
? ? ? ? print("colorful")
class Apple(Fruit):
? ? def color(self):
? ? ? ? print("red")
class Orange(Fruit):
? ? def color(self):
? ? ? ? print("orange")
apple = Apple()
orange = Orange()
apple.color()
orange.color()
# 輸出
# red
# orange
子類可以在繼承父類方法的同時,對方法進行重構。
這樣一來,子類的方法既包含父類方法的特性,同時也包含子類自己的特性:
class Fruit():
? ? def color(self):
? ? ? ? print("Fruits are colorful")
class Apple(Fruit):
? ? def color(self):
? ? ? ? super().color()
? ? ? ? print("Apple is red")
class Orange(Fruit):
? ? def color(self):
? ? ? ? super().color()
? ? ? ? print("Orange is orange")
apple = Apple()
orange = Orange()
apple.color()
orange.color()
# 輸出
# Fruits are colorful
# Apple is red
# Fruits are colorful
# Orange is orange
初始化函數繼承
如果我們需要給類傳入參數,需要使用初始化函數。如果所有子類中部分參數是相同的,那么可以在父類的初始化函數中定義這些參數,然后子類繼承父類的初始化函數,這樣所有子類就可共享這些參數,而不需要在每個子類中單獨定義。
初始化函數的繼承:
class Fruit():
? ? def __init__(self, color, shape):
? ? ? ? self.color = color
? ? ? ? self.shape = shape
class Apple(Fruit):
? ? def __init__(self, color, shape, taste):
? ? ? ? Fruit.__init__(self, color, shape) # 等價于super().__init__(color, shape)
? ? ? ? self.taste = taste
? ??
? ? def feature(self):
? ? ? ? print("Apple's color is {}, shape is {} and taste {}".format(
? ? ? ? ? ? self.color, self.shape, self.taste))
class Orange(Fruit):
? ? def __init__(self, color, shape, taste):
? ? ? ? Fruit.__init__(self, color, shape)
? ? ? ? self.taste = taste
? ??
? ? def feature(self):
? ? ? ? print("Orange's color is {}, shape is {} and taste {}".format(
? ? ? ? ? ? self.color, self.shape, self.taste))
apple = Apple("red", "square", "sour")
orange = Orange("orange", "round", "sweet")
apple.feature()
orange.feature()
# 輸出
# Apple's color is red, shape is square and taste sour
# Orange's color is orange, shape is round and taste sweet
Python中多類繼承
在單類繼承中,super()函數用于指向要繼承的父類,且不需要顯式的寫出父類名稱。
但是在多類繼承中,會涉及到查找順序(MRO)、鉆石繼承等問題。
MRO 是類的方法解析順序表, 也就是繼承父類方法時的順序表。
鉆石繼承
? ? A
? ?/ \
? B ? C
? ?\ /
? ? D
如圖所示,A是父類,B和C繼承A,D繼承B和C。
下面舉例說明鉆石繼承的繼承順序
class Plant():
? ? def __init__(self):
? ? ? ? print("Enter plant")
? ? ? ? print("Leave plant")
class Fruit(Plant):
? ? def __init__(self):
? ? ? ? print("Enter Fruit")
? ? ? ? super().__init__()
? ? ? ? print("Leave Fruit")
class Vegetable(Plant):
? ? def __init__(self):
? ? ? ? print("Enter vegetable")
? ? ? ? super().__init__()
? ? ? ? print("Leave vegetable")
class Tomato(Fruit, Vegetable):
? ? def __init__(self):
? ? ? ? print("Enter Tomato")
? ? ? ? super().__init__()
? ? ? ? print("Leave Tomato")
tomato = Tomato()
print(Tomato.__mro__)
# 輸出
# Enter Tomato
# Enter Fruit
# Enter vegetable
# Enter plant
# Leave plant
# Leave vegetable
# Leave Fruit
# Leave Tomato
# (<class '__main__.Tomato'>, <class '__main__.Fruit'>, <class '__main__.Vegetable'>, <class '__main__.Plant'>, <class 'object'>)
原文鏈接:https://blog.csdn.net/w1301100424/article/details/93858890
相關推薦
- 2022-12-11 Go?map發生內存泄漏解決方法_Golang
- 2022-08-14 Hyper-V設置虛擬機固定Ip的方法步驟_Hyper-V
- 2022-09-15 Nginx如何獲取自定義請求header頭和URL參數詳解_nginx
- 2022-01-20 docker是干什么的,docker常用命令每日一練
- 2022-06-28 EF?Core項目中不同數據庫需要的安裝包介紹_實用技巧
- 2022-08-20 Oracle刪除歸檔日志及添加定時任務_oracle
- 2022-06-16 Beego中ORM操作各類數據庫連接方式詳細示例_Golang
- 2022-08-05 C語言示例講解if?else語句的用法_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支