← 課程總覽

🏗️ 第6堂課:物件導向程式設計

程式學習第六堂課:Python class 類別、__init__ 建構子、self、繼承、封裝、多型、寵物管理系統專案
含語音講解(約 60 分鐘),附互動小測驗

📖 第一階段:類別與物件(約 25 分鐘)

1. 為什麼需要物件導向?

⏱ 10 分鐘

OOP 把「資料 + 功能」打包成類別(class)

class Student:
    def __init__(self, name):
        self.name = name
        self.scores = []
    
    def add_score(self, score):
        self.scores.append(score)
    
    def average(self):
        return sum(self.scores) / len(self.scores) if self.scores else 0

s1 = Student("丁丁")
s1.add_score(85); s1.add_score(92)
print(f"{s1.name} 平均:{s1.average()}")

2. __init__ 與 self

⏱ 15 分鐘
class Dog:
    species = "犬科"  # 類別屬性
    
    def __init__(self, name, age):
        self.name = name  # 實例屬性
        self.age = age
        self.tricks = []
    
    def bark(self):
        print(f"{self.name}:汪汪!")
    
    def learn_trick(self, trick):
        self.tricks.append(trick)

dog1 = Dog("小白", 3); dog2 = Dog("小黑", 1)
dog1.bark(); dog1.learn_trick("坐下")
🧠 self 代表「這個物件自己」。

📖 第二階段:繼承與封裝(約 20 分鐘)

3. 繼承與多型

⏱ 15 分鐘
class Animal:
    def __init__(self, name): self.name = name
    def speak(self): pass

class Cat(Animal):
    def speak(self): return f"{self.name}:喵~"

class Dog(Animal):
    def speak(self): return f"{self.name}:汪汪!"

animals = [Cat("小花"), Dog("小白")]
for a in animals: print(a.speak())  # 多型!

4. 封裝:保護內部資料

⏱ 10 分鐘
class BankAccount:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.__balance = balance  # 雙底線 = 私有
    
    def deposit(self, amount):
        if amount > 0: self.__balance += amount
    
    def get_balance(self):
        return self.__balance

acc = BankAccount("丁丁", 1000)
acc.deposit(500)
print(acc.get_balance())  # 1500

📖 第三階段:實戰(約 15 分鐘)

5. 專案:寵物管理系統

⏱ 10 分鐘
class Pet:
    def __init__(self, name, pet_type, age):
        self.name = name; self.type = pet_type
        self.age = age
        self.hunger = 50; self.happiness = 50
    
    def feed(self):
        self.hunger = max(0, self.hunger - 20)
        self.happiness += 5
        print(f"🍖 {self.name} 吃飽了!")
    
    def play(self):
        self.happiness = min(100, self.happiness + 15)
        self.hunger += 10
        print(f"⚽ {self.name} 玩得很開心!")
    
    def status(self):
        print(f"{self.type} {self.name}({self.age}歲)")
        print(f"  飢餓:{self.hunger}  快樂:{self.happiness}")

pets = [Pet("小白", "🐶 狗", 3), Pet("小花", "🐱 貓", 2)]
pets[0].play(); pets[0].feed(); pets[0].status()

🔍 OOP 進階:魔術方法與 property

⏱ 12 分鐘
class BankAccount:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self._balance = balance  # _ 前綴表示「私有」
    
    @property
    def balance(self):
        return self._balance
    
    @balance.setter
    def balance(self, value):
        if value < 0:
            raise ValueError("餘額不能為負!")
        self._balance = value
    
    def __str__(self):
        return f"{self.owner} 的帳戶:${self.balance}"
    
    def __add__(self, other):
        return BankAccount(f"{self.owner}+{other.owner}", 
                          self.balance + other.balance)

acc = BankAccount("丁丁", 1000)
print(acc)              # 丁丁 的帳戶:$1000
acc.balance += 500      # 使用 property setter
@property:讓方法看起來像屬性 | __str__:print() 時的自訂顯示
__add__:讓物件可以用 + 運算子

🔍 繼承的實際應用

⏱ 8 分鐘
class Employee:
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
    def work(self):
        return f"{self.name} 工作中..."

class Engineer(Employee):
    def __init__(self, name, salary, language):
        super().__init__(name, salary)
        self.language = language
    def work(self):  # 覆寫父類別方法
        return f"{self.name} 正在寫 {self.language} 程式碼"

team = [
    Employee("行政", 40000),
    Engineer("丁丁", 60000, "Python"),
    Engineer("拉拉", 65000, "JavaScript")
]
for person in team:
    print(person.work())  # 多型:同樣 work(),不同行為
🧬 super():呼叫父類別方法 | 多型:同名方法,不同類別有不同行為
📐 設計原則:「is-a」用繼承(Engineer is Employee),「has-a」用組合。

🧪 小測驗:你學會了嗎?

5 題選擇題,選完按「交卷」看成績
第 1 / 5 題
__init__ 方法什麼時候被呼叫?
第 2 / 5 題
self 在 class 中代表什麼?
第 3 / 5 題
class Cat(Animal) 中 Cat 獲得什麼?
第 4 / 5 題
雙底線 __balance 的作用?
第 5 / 5 題
多型的核心概念?
你的得分
0/5

🎯 第6堂課,你學會了什麼?

class 類別__init__繼承封裝多型寵物管理系統

從現在起,你不再只寫「腳本」,而是在設計系統

→ 前往第7堂課