
在前面的章節中,我們主要使用程序式程式設計 (Procedural Programming),也就是將指令一行一行地列出。然而,當程式變得複雜時,這種方式會讓代碼變得難以管理。
物件導向程式設計 (Object-Oriented Programming, OOP) 提供了一種以「物件」為核心的思考方式,讓我們能像堆積木一樣構建軟體。
1. 類別 (Class) 與物件 (Object) 的概念
這兩個概念是 OOP 的基石:
- 類別 (Class):是設計圖、藍圖或模具。它定義了物件應該有什麼屬性 (Data) 和行為 (Method)。
- 物件 (Object):是根據藍圖製造出來的具體實體 (Instance)。
比喻:
Car(類別) 是汽車的設計圖;而你車庫裡那台紅色的 Toyota (物件) 則是根據這個設計圖造出來的實體。
2. 定義類別與建立物件
在 Python 中,我們使用 class 關鍵字來定義類別。習慣上,類別名稱使用 PascalCase (大寫駝峰式)。
class Dog:
# 類別屬性 (Class Attribute):所有物件共享
species = "Canis familiaris"
# 初始化方法 (Constructor):建立物件時自動執行
def __init__(self, name, age):
# 實例屬性 (Instance Attribute):每個物件獨有
self.name = name
self.age = age
# 實例方法 (Instance Method):定義物件的行為
def description(self):
return f"{self.name} is {self.age} years old"
def speak(self, sound):
return f"{self.name} says {sound}"
2.1 什麼是 __init__ 與 self?
這是初學者最容易困惑的地方:
__init__: 這是一個特殊方法 (Magic Method),當你創建新物件時 (如Dog("Buddy", 3)),Python 會自動呼叫它來初始化物件的狀態。self: 代表物件本身。當你呼叫dog1.speak("Woof")時,Python 背後其實是執行Dog.speak(dog1, "Woof")。self讓方法知道「現在是哪一隻狗在叫」。
2.2 實例化 (Instantiation)
# 建立兩個 Dog 物件
buddy = Dog("Buddy", 9)
miles = Dog("Miles", 4)
# 存取屬性
print(buddy.name) # Buddy
print(miles.age) # 4
# 呼叫方法
print(buddy.description()) # Buddy is 9 years old
print(miles.speak("Woof Woof")) # Miles says Woof Woof
3. 類別變數 vs 實例變數
- 實例變數 (Instance Variable): 定義在
__init__中 (用self.variable)。每個物件都有自己獨立的一份拷貝 (如每隻狗的名字不同)。 - 類別變數 (Class Variable): 定義在類別層級。所有物件共享同一份資料 (如所有狗的生物學名都是 “Canis familiaris”)。
print(buddy.species) # Canis familiaris
print(miles.species) # Canis familiaris
# 修改類別變數,所有物件都會受到影響 (視情況而定)
Dog.species = "New Species"
print(buddy.species) # New Species
4. 物件導向四大支柱 (The 4 Pillars of OOP)
OOP 不僅僅是語法,更是一種設計哲學。
4.1 封裝 (Encapsulation)
將資料 (屬性) 與操作資料的函數 (方法) 綁定在一起,並隱藏內部實作細節。在 Python 中,通常用 _ (單底線) 或 __ (雙底線) 前綴來表示私有屬性。
class Account:
def __init__(self, owner, balance):
self.owner = owner
self.__balance = balance # 私有屬性,無法直接從外部存取
def deposit(self, amount):
if amount > 0:
self.__balance += amount
4.2 繼承 (Inheritance)
子類別 (Child Class) 可以繼承父類別 (Parent Class) 的屬性與方法,避免重複造輪子。
# 父類別
class Animal:
def speak(self):
pass
# 子類別繼承 Animal
class Cat(Animal):
def speak(self):
return "Meow"
class Dog(Animal):
def speak(self):
return "Woof"
4.3 多型 (Polymorphism)
不同類別的物件可以透過相同的介面進行操作。在上面的例子中,無論是 Cat 還是 Dog,我們都可以呼叫 speak(),它們會表現出各自的行為。
animals = [Cat(), Dog()]
for animal in animals:
print(animal.speak()) # 分別印出 Meow 和 Woof
4.4 抽象 (Abstraction)
只展示必要的功能,隱藏複雜的背景邏輯。使用者只需要知道「按這個按鈕車子會動」,不需要知道引擎是如何燃燒汽油的。
5. 總結
物件導向是通往高階軟體開發的必經之路。
本章重點回顧:
- Class: 設計圖。
- Object: 實體。
- self: 物件自己的參照。
- Inheritance: 讓子類別擁有父類別的功能,實現程式碼重用。
在掌握了所有的基礎與 OOP 概念後,最後一章我們將探討軟體品質的守門員——測試與除錯 (Testing & Debugging),學習如何寫出無 Bug 的程式碼!
延伸閱讀: