第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()
調用父類別的方法。- 多層繼承與多重繼承:熟悉多層繼承和多重繼承的應用,並理解它們的作用與限制。
任務
- 創建一個類別
Employee
,並建立一個子類別Manager
,Manager
應該有一個額外的屬性team_size
,並重寫introduce()
方法來顯示額外資訊。 - 創建一個類別
Shape
,其中有一個方法area()
,然後建立兩個子類別Circle
和Rectangle
,並重寫area()
方法來計算各自的面積。 - 創建一個類別
Vehicle
,並建立子類別Car
和Motorcycle
,每個子類別應該有自己特定的方法和屬性,並使用super()
初始化共同的屬性。 - 創建兩個類別
Flyable
和Swimmable
,並建立一個子類別Bird
同時繼承這兩個類別,讓Bird
物件能同時飛行與游泳。
本文章以 CC BY 4.0 授權