文章

第16天:類別繼承

課程簡介

類別繼承是物件導向程式設計(OOP)中的重要概念,它允許一個類別(子類別)從另一個類別(父類別)繼承屬性和方法,並可擴展或重寫這些功能。這種結構使得程式碼更加模組化、可重用且易於維護。今天我們將深入學習類別繼承、方法重寫以及多層繼承等進階概念。


學習內容

1. 繼承的基本概念

繼承是一個類別獲取另一個類別的屬性和方法。被繼承的類別稱為 父類別(或基類),繼承的類別稱為 子類別(或派生類)。

範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 父類別
class Animal:
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        print(f"{self.name} makes a sound.")

# 子類別 Dog 繼承 Animal
class Dog(Animal):
    def bark(self):
        print(f"{self.name} barks.")

# 創建 Dog 物件
my_dog = Dog("Buddy")
my_dog.speak()  # 輸出: Buddy makes a sound.
my_dog.bark()   # 輸出: Buddy barks.

2. 方法重寫(Override)

子類別可以重寫父類別的方法,以提供不同的實現。這可以讓子類別在保留父類別基礎功能的同時,實現自己特有的行為。

範例:

1
2
3
4
5
6
class Cat(Animal):
    def speak(self):  # 重寫父類別的 speak 方法
        print(f"{self.name} meows.")

my_cat = Cat("Whiskers")
my_cat.speak()  # 輸出: Whiskers meows.

3. 使用 super() 調用父類別的方法

有時子類別希望重寫某個方法,但仍然想要保留父類別方法的部分功能。可以使用 super() 調用父類別的方法。

範例:

1
2
3
4
5
6
7
8
9
10
class Bird(Animal):
    def speak(self):
        super().speak()  # 調用父類別的 speak 方法
        print(f"{self.name} chirps.")

my_bird = Bird("Tweety")
my_bird.speak()
# 輸出:
# Tweety makes a sound.
# Tweety chirps.

4. 子類別的初始化

在初始化子類別時,通常需要先調用父類別的 __init__() 方法,以確保父類別的屬性能正確初始化。這可以使用 super() 來實現。

範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Vehicle:
    def __init__(self, brand, model):
        self.brand = brand
        self.model = model

class Car(Vehicle):
    def __init__(self, brand, model, seats):
        super().__init__(brand, model)  # 調用父類別的 __init__
        self.seats = seats

my_car = Car("Toyota", "Corolla", 5)
print(my_car.brand)  # 輸出: Toyota
print(my_car.model)  # 輸出: Corolla
print(my_car.seats)  # 輸出: 5

5. 多層繼承

Python 支援多層繼承,即一個類別可以繼承自另一個已經繼承了某個類別的子類別。這使得一個類別可以通過多層繼承獲得更為複雜的功能。

範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Animal:
    def speak(self):
        print("Animal makes a sound.")

class Mammal(Animal):
    def walk(self):
        print("Mammal walks.")

class Dog(Mammal):
    def bark(self):
        print("Dog barks.")

my_dog = Dog()
my_dog.speak()  # 輸出: Animal makes a sound.
my_dog.walk()   # 輸出: Mammal walks.
my_dog.bark()   # 輸出: Dog barks.

6. 多重繼承

Python 支援 多重繼承,即一個子類別可以同時繼承多個父類別的屬性與方法。但這樣的結構可能會導致某些複雜的問題,如方法解析順序(MRO,Method Resolution Order)。

範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Flyable:
    def fly(self):
        print("This can fly.")

class Swimmable:
    def swim(self):
        print("This can swim.")

class Duck(Flyable, Swimmable):
    pass

my_duck = Duck()
my_duck.fly()   # 輸出: This can fly.
my_duck.swim()  # 輸出: This can swim.

教學重點

  • 繼承的基本概念:理解類別繼承如何重用父類別的屬性與方法。
  • 方法重寫:學會如何在子類別中重寫父類別的方法,並定義自己的行為。
  • super() 的使用:了解如何在子類別中使用 super() 調用父類別的方法。
  • 多層繼承與多重繼承:熟悉多層繼承和多重繼承的應用,並理解它們的作用與限制。

任務

  1. 創建一個類別 Employee,並建立一個子類別 ManagerManager 應該有一個額外的屬性 team_size,並重寫 introduce() 方法來顯示額外資訊。
  2. 創建一個類別 Shape,其中有一個方法 area(),然後建立兩個子類別 CircleRectangle,並重寫 area() 方法來計算各自的面積。
  3. 創建一個類別 Vehicle,並建立子類別 CarMotorcycle,每個子類別應該有自己特定的方法和屬性,並使用 super() 初始化共同的屬性。
  4. 創建兩個類別 FlyableSwimmable,並建立一個子類別 Bird 同時繼承這兩個類別,讓 Bird 物件能同時飛行與游泳。
本文章以 CC BY 4.0 授權