2025年3月6日 星期四

Python 18 小時入門--第 6 小時:物件導向程式設計(OOP)

 📌 第 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 歲。

📌 重點

  1. __init__()建構函式(Constructor),在創建物件時自動執行
  2. self 代表 物件本身,可以用來存取 屬性與方法
  3. introduce() 是物件的方法,可以存取 self.nameself.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 的類別可以有兩種屬性:

  1. 實例屬性(Instance Attribute):每個物件有獨立的屬性
  2. 類別屬性(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 物件的 nameage 都是獨立的

🟢 類別屬性

class Person:
    species = "人類"  # 類別屬性

p1 = Person()
p2 = Person()

print(p1.species)  # 人類
print(p2.species)  # 人類

🔹 species 是類別屬性,所有物件共用同一個值


🔹 類別方法與靜態方法

Python 有三種方法:

  1. 實例方法(Instance Method) → 操作物件本身,self 代表物件
  2. 類別方法(Class Method) → 操作類別,cls 代表類別
  3. 靜態方法(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 沒有 selfcls,可用來定義工具函式


🔹 繼承(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:汪汪!

📌 重點

  1. Dog 繼承(extends) Animal
  2. Dog 覆寫(Override)make_sound() 方法
  3. 可以直接存取 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),接下來我們將進入 檔案處理與錯誤處理,讓你學會讀寫文件與處理錯誤!🚀

沒有留言:

張貼留言