Python 類別與物件:物件導向程式設計基礎 (第 9 章)

站主自己的課程,請大家支持
揭秘站長的架站心法:如何利用 Hugo × AI 打造高質感個人品牌網站? 揭秘站長的架站心法:如何利用 Hugo × AI 打造高質感個人品牌網站?
  • Post by
  • Dec 23, 2023
post-thumb

在前面的章節中,我們主要使用程序式程式設計 (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

這是初學者最容易困惑的地方:

  1. __init__: 這是一個特殊方法 (Magic Method),當你創建新物件時 (如 Dog("Buddy", 3)),Python 會自動呼叫它來初始化物件的狀態。
  2. 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 的程式碼!


延伸閱讀

LATEST POST
TAG