初學者指南:深入了解 Python 繼承

更新日期: 2024 年 11 月 18 日

在學習 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 覆蓋了 Animalmake_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()

輸出:

動物發出聲音
狗狗汪汪叫
  • 說明Dogmake_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 同時繼承了 FlyerSwimmer 的方法。

注意事項

  • 方法解析順序(MRO):Python 使用方法解析順序(Method Resolution Order)來確定在多重繼承中調用哪個父類別的方法。
  • 菱形繼承問題:需要小心處理多重繼承中的命名衝突和菱形繼承。

繼承的應用場景

  1. 代碼重用:將通用的屬性和方法定義在父類別中,子類別繼承後無需重複編寫。
  2. 多型性:透過覆蓋父類別的方法,子類別可以實現不同的行為。
   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())
  1. 建立類別層次結構:透過繼承,建立清晰的類別層次,方便管理和維護。
  2. 擴展功能:在不修改父類別的情況下,為子類別添加新的屬性和方法。

結論

繼承是 Python 物件導向程式設計中的重要機制,透過繼承,我們可以:

  • 重用代碼:避免重複編寫相同的代碼,提高開發效率。
  • 實現多型性:子類別可以覆蓋父類別的方法,實現不同的行為。
  • 建立結構化的類別層次:使程式更具組織性和可讀性。
  • 易於維護和擴展:修改父類別,子類別自動繼承更新;可以在子類別中添加新功能。

理解並熟練使用繼承,將有助於你更好地掌握 Python 的物件導向程式設計,編寫出更具結構性和可維護性的程式碼。


進一步學習

  • 多型性與抽象類別:深入瞭解多型性,學習如何使用抽象類別和介面。
  • 組合(Composition):學習組合的概念,瞭解何時使用繼承,何時使用組合。
  • 方法解析順序(MRO):研究 Python 中的 MRO,理解多重繼承的細節。
  • 設計模式:學習常見的設計模式,如模板方法模式、策略模式等,提升程式設計能力。

Similar Posts