網站首頁 編程語言 正文
1 類繼承
Python 是面向對象的編程語言,因此支持面向對象的三大特性之一:繼承。
繼承是代碼重用的一種途徑,Python 中的繼承就像現實生活中的繼承一樣,子類可以順利繼承父類的屬性或方法。允許我們再對象之間創建復雜且類似現實世界的關系。
繼承父類的類稱為子類、派生類或擴展類,被繼承的類被稱為父類、超類或基類。
在之前的文中學到 Python 中的構造函數,并且每一個類都有一個構造函數 __init__()
,在 Python 中任何類都是繼承于最大的基類 Object
,如下所示:
Python 3.10.4 (v3.10.4:9d38120e33, Mar 23 2022, 17:29:05) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> dir(object) ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] >>>
Python 中繼承類的語法如下:
class SubClass(SuperClass):
1.1 繼承的簡單例子
先來看一個簡單的繼承例子,假如有一個 Car
類繼承于更通用的類 Vehicle
,然后也可以定義一個 Motorcyle
類,繼承圖如下:
Python 代碼實現如上繼承關系,如下:
class Vehicle: def __init__(self, started = False, speed = 0): self.started = started self.speed = speed def start(self): self.started = True print("啟動,皮皮蝦我們走") def stop(self): self.speed = 0 def increaseSpeed(self, delta): if self.started: self.speed += delta print("Vroooooom!") else: print("還沒啟動呢!") class Car(Vehicle): trunk_open = False def open_trunk(self): self.trunk_open = True def close_trunk(self): self.trunk_open = False
我們的汽車繼承了車輛類的所有方法和變量,但添加了一個額外的變量和兩個方法來操作后備箱。
有時你想覆蓋繼承的 __init__()
函數。為了演示,我們可以創建一個摩托車類。大多數摩托車都有一個中心支架。我們將在初始化時添加輸出或輸入的功能:
class Motorcycle(Vehicle): def __init__(self, center_start_out = False): self.center_start_out = center_start_out super().__init__() def start(self): print("Sorry, out of fuel!")
需要注意的是,在重寫構造函數時,我們繼承的父類的構造函數不會被改變。如果想要更改這個功能,需要自己調用它。這是通過 super()
函數完成返回父類的引用,然后才能調用父類的構造函數。
class Vehicle: def __init__(self, started = False, speed = 0): self.started = started self.speed = speed def start(self): self.started = True print("啟動,皮皮蝦我們走") def stop(self): self.speed = 0 def increaseSpeed(self, delta): if self.started: self.speed += delta print("Vroooooom!") else: print("還沒啟動呢!") class Car(Vehicle): trunk_open = False def open_trunk(self): self.trunk_open = True def close_trunk(self): self.trunk_open = False class Motorcycle(Vehicle): def __init__(self, center_start_out = False): self.center_start_out = center_start_out super().__init__() V = Vehicle() C = Car() M = Motorcycle() print(type(V)) print(type(C)) print(type(M)) print("摩托車是交通工具的實例嗎?",isinstance(M, Vehicle))
super()
函數返回一個代表父類的臨時對象。這用于訪問父類的方法和屬性。在 super()
函數的幫助下,我們還可以訪問被覆蓋的方法。
運行上面代碼的結果如下:
2 繼承的類型
2.1 單繼承
單繼承就是一個子類只有一個基類的繼承方式,顯示圖如下:
最基本的例子如下:
class Animal: print("我是動物") class Cat(Animal): print("我是貓")
2.2 多繼承
多繼承就是一個子類可以繼承多個父類的繼承方式,相對于單繼承來說,多繼承更復雜,容易造成菱形繼承問題,即兩個父類同時繼承了一個基類,而子類會包含多個父類的內容,產生代碼歧義。
多繼承結構圖:
語法結構如下:
class A: def __init__(self, name): self.name = name def introduction(self): print("我叫", self.name) class B: def __init__(self, age): self.age = age def introduction(self): print("我今年 %d 歲了" % self.age) class C(A, B): pass c = C(18) c.introduction()
運行代碼:
我叫 18
從上面的執行結果來看,本來想介紹年齡,最后卻輸出了“我叫 18”,這種現象就是繼承順序導致的,類 A 在類 B 的前面,所以對于同名的屬性和方法子類都會調用 類 A 的。
2.3 多級繼承
當一個類繼承一個子類時,它被稱為多級繼承。繼承子類的類被稱為孫子類。多級繼承會導致孫子和子關系。孫子類可以訪問子類和父類的屬性。
多級繼承結構圖:
class Parent: str1 = "Python" class Child(Parent): str2 = " is the best programming?" class GrandChild(Child): def get_str(self): print(self.str1 + self.str2) person = GrandChild() person.get_str()
運行結果:
Python is the best programming?
在上面的代碼示例中,GrandChild 是 Child 的一個子類,而 Child 是 Parent 的一個子類。因此,GrandChild 可以訪問父類和子類的屬性。
2.4 分層繼承
當多個類繼承同一個類時,稱為分層繼承。結構圖如下:
代碼如下:
class SuperClass: x = 2022 class SubClass1(SuperClass): pass class SubClass2(SuperClass): pass class SubClass3(SuperClass): pass a = SubClass1() b = SubClass2() c = SubClass3() print(a.x, b.x, c.x)
運行結果:
(2022, 2022, 2022)
2.5 Python中的混合繼承
一種以上繼承類型的組合稱為混合繼承。結構圖如下:
代碼例子如下:
class X: num = 2023 class A(X): pass class B(A): pass class C(A): pass class D(B, C): pass ob = D() print(D.num)
在上面的代碼示例中,我們結合了多級繼承、多重繼承和分層繼承,因此創建了混合繼承。輸出結果:
2023
3 總結
繼承允許我們定義繼承另一個類的所有方法和屬性的類。父類是繼承的類,也稱為基類、派生類。子類是從另一個類繼承的類,也稱為派生類。
本文介紹了 Python 的繼承方法和繼承的 5 種分類,并在簡單的例子中實踐了各種繼承的方式。但繼承的實際用法可不會像本文這樣簡單,今后介紹更多相關的知識。
原文鏈接:https://juejin.cn/post/7158843760707633166
相關推薦
- 2023-07-16 oracle 創建定時任務
- 2022-06-29 python人工智能tensorflow函數tensorboard使用方法_python
- 2022-06-06 HTTP中的請求頭和響應頭各字段屬性解釋及狀態碼
- 2023-10-15 達夢錯誤碼信息-PRO*C 錯誤碼匯編
- 2023-01-27 Redux?Toolkit的基本使用示例詳解(Redux工具包)_React
- 2022-08-10 Python實現以主程序的形式執行模塊_python
- 2022-09-17 利用Python提取PDF文本的簡單方法實例_python
- 2022-05-20 nginx刷新頁面出現404解決方案(親測有效)_nginx
- 最近更新
-
- 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同步修改后的遠程分支