📌 第 6 小時:物件導向程式設計(OOP)
Python 支援 物件導向程式設計(Object-Oriented Programming, OOP),這種編程範式可以讓我們用 類別(Class) 來創建 物件(Object),從而提高程式的模組化、可讀性和可擴展性。
🔹 什麼是物件導向(OOP)?
在 OOP 中,我們將 資料與行為封裝成物件,讓程式更具結構化。例如:
- 類別(Class):定義物件的結構,例如「學生」
- 物件(Object):根據類別創建的具體實例,例如「小明是學生」
- 屬性(Attributes):物件的特徵,例如「姓名、年齡」
- 方法(Methods):物件的行為,例如「讀書、考試」
🔹 定義類別與創建物件
Python 使用 class
關鍵字定義類別:
class Student:
def __init__(self, name, age): # 初始化方法(Constructor)
self.name = name # 屬性
self.age = age
def introduce(self): # 方法
print(f"我是 {self.name},今年 {self.age} 歲。")
# 創建物件(Object)
s1 = Student("小明", 18)
s2 = Student("小華", 20)
s1.introduce() # 我是 小明,今年 18 歲。
s2.introduce() # 我是 小華,今年 20 歲。
📌 重點
__init__()
是 建構函式(Constructor),在創建物件時自動執行self
代表 物件本身,可以用來存取 屬性與方法introduce()
是物件的方法,可以存取self.name
和self.age
🔹 類別與物件的關係
class Car:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def show_info(self):
print(f"車廠: {self.brand}, 型號: {self.model}")
# 創建物件
car1 = Car("Toyota", "Corolla")
car2 = Car("Tesla", "Model 3")
car1.show_info() # 車廠: Toyota, 型號: Corolla
car2.show_info() # 車廠: Tesla, 型號: Model 3
📌 物件導向的優勢
- 封裝(Encapsulation):將變數與方法封裝在類別內部
- 模組化(Modularity):可以重複使用類別來創建不同的物件
- 可擴展性(Extensibility):可以擴充類別的功能
🔹 類別的屬性與方法
Python 的類別可以有兩種屬性:
- 實例屬性(Instance Attribute):每個物件有獨立的屬性
- 類別屬性(Class Attribute):所有物件共用的屬性
🟢 實例屬性
class Person:
def __init__(self, name, age):
self.name = name # 實例屬性
self.age = age
p1 = Person("Alice", 25)
p2 = Person("Bob", 30)
print(p1.name, p1.age) # Alice 25
print(p2.name, p2.age) # Bob 30
🔹 每個
Person
物件的name
和age
都是獨立的
🟢 類別屬性
class Person:
species = "人類" # 類別屬性
p1 = Person()
p2 = Person()
print(p1.species) # 人類
print(p2.species) # 人類
🔹
species
是類別屬性,所有物件共用同一個值
🔹 類別方法與靜態方法
Python 有三種方法:
- 實例方法(Instance Method) → 操作物件本身,
self
代表物件 - 類別方法(Class Method) → 操作類別,
cls
代表類別 - 靜態方法(Static Method) → 不依賴類別與物件
🟢 實例方法
class Dog:
def __init__(self, name):
self.name = name
def bark(self): # 實例方法
print(f"{self.name}:汪汪!")
dog1 = Dog("Buddy")
dog1.bark() # Buddy:汪汪!
🟢 類別方法
class Animal:
species = "動物"
@classmethod
def change_species(cls, new_species):
cls.species = new_species
Animal.change_species("哺乳類")
print(Animal.species) # 哺乳類
🔹
@classmethod
讓方法可以操作類別變數,而非單一物件
🟢 靜態方法
class MathUtils:
@staticmethod
def add(a, b):
return a + b
print(MathUtils.add(5, 10)) # 15
🔹
@staticmethod
沒有self
或cls
,可用來定義工具函式
🔹 繼承(Inheritance)
繼承(Inheritance) 允許新類別重用舊類別的屬性與方法,並擴展新功能。
🟢 基本繼承
class Animal:
def __init__(self, name):
self.name = name
def make_sound(self):
print("這是一種動物的聲音")
# Dog 繼承 Animal
class Dog(Animal):
def make_sound(self): # 覆寫父類別的方法
print(f"{self.name}:汪汪!")
dog = Dog("Buddy")
dog.make_sound() # Buddy:汪汪!
📌 重點
Dog
繼承(extends)Animal
Dog
覆寫(Override) 了make_sound()
方法- 可以直接存取
Animal
的屬性(如self.name
)
🔹 多型(Polymorphism)
多型允許 不同的類別 使用相同的方法名稱,但有不同的行為:
class Cat:
def make_sound(self):
print("喵喵!")
class Dog:
def make_sound(self):
print("汪汪!")
# 多型函式
def animal_sound(animal):
animal.make_sound()
cat = Cat()
dog = Dog()
animal_sound(cat) # 喵喵!
animal_sound(dog) # 汪汪!
📌 不同類別的 make_sound()
方法在 animal_sound()
函式中表現不同,這就是多型!
📌 第 6 小時小結
✅ OOP 是一種將資料與行為封裝成物件的程式設計方式
✅ 類別(Class)定義物件的結構,物件(Object)是類別的實例
✅ __init__()
是建構函式,負責初始化物件屬性
✅ self
代表物件,cls
代表類別
✅ 繼承(Inheritance)讓子類別可以重用父類別的方法
✅ 多型(Polymorphism)允許不同類別使用相同方法名稱,但有不同行為
學完這一章,你已經掌握 Python 物件導向編程(OOP),接下來我們將進入 檔案處理與錯誤處理,讓你學會讀寫文件與處理錯誤!🚀
沒有留言:
張貼留言