初學者指南:深入了解 Python 繼承
更新日期: 2024 年 11 月 18 日
本文為 python 物件導向系列文:第四篇
在學習 Python 的物件導向程式設計(Object-Oriented Programming, OOP)時,繼承(Inheritance) 是一個核心概念。
繼承允許我們基於已經存在的類別,創建新的類別,從而實現代碼的重用和擴展。
透過繼承,我們可以建立類別之間的層次結構,實現多型性,並提高程式的可維護性。
本文將為新手詳細介紹 Python 中的繼承,解釋其作用、如何定義和使用,以及其優點和應用場景。
什麼是繼承?
繼承 是物件導向程式設計中的一個機制,允許我們創建一個新的類別(子類別),該類別基於已有的類別(父類別或基類),並繼承其屬性和方法。
透過繼承,子類別可以:
- 繼承父類別的所有屬性和方法。
- 覆蓋父類別的方法,以實現不同的行為。
- 擴展父類別的功能,添加新的屬性和方法。
優點
- 代碼重用:避免重複編寫相同的代碼。
- 結構清晰:建立類別之間的層次關係,程式結構更明確。
- 易於維護:修改父類別的代碼,子類別會自動獲得更新。
定義子類別
基本語法
class 子類別名稱(父類別名稱):
# 子類別的定義
pass
- 父類別名稱:子類別要繼承的父類別,可以是內建類別或自定義類別。
- 子類別名稱:新創建的類別名稱。
示例
class Animal:
def eat(self):
print("動物正在進食")
class Dog(Animal):
def bark(self):
print("狗在汪汪叫")
在這個例子中,Dog
繼承了 Animal
,因此 Dog
擁有 Animal
的所有方法。
繼承的基本語法
創建父類別
class ParentClass:
def __init__(self, attribute):
self.attribute = attribute
def parent_method(self):
print("這是父類別的方法")
創建子類別
class ChildClass(ParentClass):
pass
使用子類別
child = ChildClass("值")
print(child.attribute) # 輸出:值
child.parent_method() # 輸出:這是父類別的方法
- 說明:子類別
ChildClass
繼承了父類別ParentClass
的所有屬性和方法。
方法覆蓋與擴展
方法覆蓋(Override)
子類別可以定義與父類別同名的方法,以實現不同的行為,這稱為方法覆蓋。
示例
class Animal:
def make_sound(self):
print("動物發出聲音")
class Cat(Animal):
def make_sound(self):
print("貓咪喵喵叫")
cat = Cat()
cat.make_sound() # 輸出:貓咪喵喵叫
- 說明:
Cat
覆蓋了Animal
的make_sound
方法。
方法擴展
在覆蓋父類別方法的同時,仍然希望保留父類別的方法功能,可以使用 super()
函數。
使用 super()
函數
super()
函數返回父類別的物件,可以用來調用父類別的方法。
示例
class Animal:
def make_sound(self):
print("動物發出聲音")
class Dog(Animal):
def make_sound(self):
super().make_sound() # 調用父類別的方法
print("狗狗汪汪叫")
dog = Dog()
dog.make_sound()
輸出:
動物發出聲音
狗狗汪汪叫
- 說明:
Dog
的make_sound
方法首先調用super().make_sound()
,然後添加自己的行為。
初始化父類別
在子類別的 __init__
方法中,可以使用 super().__init__()
來初始化父類別的屬性。
示例
class Person:
def __init__(self, name):
self.name = name
class Student(Person):
def __init__(self, name, student_id):
super().__init__(name) # 初始化父類別的屬性
self.student_id = student_id
student = Student("Alice", "S001")
print(student.name) # 輸出:Alice
print(student.student_id) # 輸出:S001
- 說明:
Student
繼承了Person
,並在自己的__init__
方法中使用super().__init__(name)
初始化name
屬性。
多重繼承
Python 支援多重繼承,允許一個類別繼承多個父類別。
語法
class 子類別名稱(父類別1, 父類別2, ...):
# 子類別的定義
pass
示例
class Flyer:
def fly(self):
print("能飛行")
class Swimmer:
def swim(self):
print("能游泳")
class FlyingFish(Flyer, Swimmer):
pass
fish = FlyingFish()
fish.fly() # 輸出:能飛行
fish.swim() # 輸出:能游泳
- 說明:
FlyingFish
同時繼承了Flyer
和Swimmer
的方法。
注意事項
- 方法解析順序(MRO):Python 使用方法解析順序(Method Resolution Order)來確定在多重繼承中調用哪個父類別的方法。
- 菱形繼承問題:需要小心處理多重繼承中的命名衝突和菱形繼承。
繼承的應用場景
- 代碼重用:將通用的屬性和方法定義在父類別中,子類別繼承後無需重複編寫。
- 多型性:透過覆蓋父類別的方法,子類別可以實現不同的行為。
class Shape:
def area(self):
pass
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14159 * self.radius ** 2
shapes = [Rectangle(5, 3), Circle(4)]
for shape in shapes:
print(shape.area())
- 建立類別層次結構:透過繼承,建立清晰的類別層次,方便管理和維護。
- 擴展功能:在不修改父類別的情況下,為子類別添加新的屬性和方法。
結論
繼承是 Python 物件導向程式設計中的重要機制,透過繼承,我們可以:
- 重用代碼:避免重複編寫相同的代碼,提高開發效率。
- 實現多型性:子類別可以覆蓋父類別的方法,實現不同的行為。
- 建立結構化的類別層次:使程式更具組織性和可讀性。
- 易於維護和擴展:修改父類別,子類別自動繼承更新;可以在子類別中添加新功能。
理解並熟練使用繼承,將有助於你更好地掌握 Python 的物件導向程式設計,編寫出更具結構性和可維護性的程式碼。
進一步學習
- 多型性與抽象類別:深入瞭解多型性,學習如何使用抽象類別和介面。
- 組合(Composition):學習組合的概念,瞭解何時使用繼承,何時使用組合。
- 方法解析順序(MRO):研究 Python 中的 MRO,理解多重繼承的細節。
- 設計模式:學習常見的設計模式,如模板方法模式、策略模式等,提升程式設計能力。