一文帶你瞭解 Python 中的繼承知識點
theme: v-green highlight: a11y-dark
持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第 26 天,點擊查看活動詳情
1 類繼承
Python 是面向對象的編程語言,因此支持面向對象的三大特性之一:繼承。
繼承是代碼重用的一種途徑,Python 中的繼承就像現實生活中的繼承一樣,子類可以順利繼承父類的屬性或方法。允許我們再對象之間創建複雜且類似現實世界的關係。
繼承父類的類稱為子類、派生類或擴展類,被繼承的類被稱為父類、超類或基類。
在之前的文中學到 Python 中的構造函數,並且每一個類都有一個構造函數 __init__()
,在 Python 中任何類都是繼承於最大的基類 Object
,如下所示:
```python 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 中繼承類的語法如下:
python
class SubClass(SuperClass):
1.1 繼承的簡單例子
先來看一個簡單的繼承例子,假如有一個 Car
類繼承於更通用的類 Vehicle
,然後也可以定義一個 Motorcyle
類,繼承圖如下:
Python 代碼實現如上繼承關係,如下:
```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__()
函數。為了演示,我們可以創建一個摩托車類。大多數摩托車都有一箇中心支架。我們將在初始化時添加輸出或輸入的功能:
python
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()
函數完成返回父類的引用,然後才能調用父類的構造函數。
```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
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 單繼承
單繼承就是一個子類只有一個基類的繼承方式,顯示圖如下:
最基本的例子如下:
```python class Animal: print("我是動物")
class Cat(Animal): print("我是貓") ```
2.2 多繼承
多繼承就是一個子類可以繼承多個父類的繼承方式,相對於單繼承來説,多繼承更復雜,容易造成菱形繼承問題,即兩個父類同時繼承了一個基類,而子類會包含多個父類的內容,產生代碼歧義。
多繼承結構圖:
語法結構如下:
```python 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 多級繼承
當一個類繼承一個子類時,它被稱為多級繼承。繼承子類的類被稱為孫子類。多級繼承會導致孫子和子關係。孫子類可以訪問子類和父類的屬性。
多級繼承結構圖:
```python 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 分層繼承
當多個類繼承同一個類時,稱為分層繼承。結構圖如下:
代碼如下:
```python 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中的混合繼承
一種以上繼承類型的組合稱為混合繼承。結構圖如下:
代碼例子如下:
```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 種分類,並在簡單的例子中實踐了各種繼承的方式。但繼承的實際用法可不會像本文這樣簡單,今後介紹更多相關的知識。
希望本文能對你有所幫助,如果喜歡本文,可以點個關注。
這裏是宇宙之一粟,下一篇文章見!
宇宙古今無有窮期,一生不過須臾,當思奮爭。
參考鏈接:
- Python 官方文檔——9.5. Inheritance
- Inheritance in Python with Types and Examples - Python Geeks
- 一文帶你瞭解 Python 中的繼承知識點
- 如何使用 HTML 和 CSS 寫一個登錄界面
- 代碼之外:寫作是倒逼成長的最佳方式
- Redis 的快速介紹及其基本數據類型和操作
- 經久不衰的設計定律就是——不要讓我思考的設計
- 一文了解 Python 中的裝飾器
- 聊聊 Go 語言與雲原生技術
- Go Web 編程入門:驗證器
- Golang 的藝術、哲學和科學
- Django API 開發:視圖設置和路由
- Web 編程入門:什麼是Web API?
- Python 實現設計模式之工廠模式
- 好開心我進入了面試環節,那麼我該如何自我介紹?
- 鴻蒙學習筆記:利用鴻蒙JavaUI 框架的 WebView 加載在線網頁
- Go 語言入門很簡單:讀寫鎖