一、為什麼需要面向對象?

想象你要開發一個學生管理系統。如果用函數式寫法,你需要分別管理姓名、年齡、成績等數據,邏輯分散且容易出錯。

而面向對象的思想是:把相關的數據和操作封裝在一起,形成一個“學生”對象。這樣代碼更清晰、更易維護、也更容易複用。

二、什麼是類(Class)?什麼是對象(Object)?

  • 類(Class):是對象的“藍圖”或“模板”,定義了對象有哪些屬性(數據)和方法(行為)。
  • 對象(Object):是類的一個具體“實例”。

舉個例子:
“汽車”是一個,它有顏色、品牌等屬性,有啓動、剎車等方法。
而你家停着的那輛紅色特斯拉,就是一個對象(Car 類的一個實例)。

三、定義一個類

使用 class 關鍵字定義類。通常類名首字母大寫。

class Dog:
    # 初始化方法(構造函數)
    def __init__(self, name, age):
        self.name = name  # 實例屬性
        self.age = age

    # 實例方法
    def bark(self):
        print(f"{self.name} 汪汪叫!")

    def get_info(self):
        return f"名字: {self.name}, 年齡: {self.age}歲"

🔑 關鍵點:

  • __init__ 是特殊方法,創建對象時自動調用;
  • self 代表當前對象本身,必須作為第一個參數(但調用時不用傳)。

四、創建和使用對象

# 創建兩個 Dog 對象
dog1 = Dog("旺財", 3)
dog2 = Dog("小白", 2)

# 調用方法
dog1.bark()          # 輸出:旺財 汪汪叫!
print(dog2.get_info())  # 輸出:名字: 小白, 年齡: 2歲

# 訪問屬性
print(dog1.name)     # 輸出:旺財

每個對象都有自己獨立的屬性值,互不影響。

五、添加更多功能:封裝與方法

我們可以在類中加入更多邏輯,比如讓狗“過生日”:

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def birthday(self):
        self.age += 1
        print(f"{self.name} 又長大一歲啦!現在 {self.age} 歲。")

# 使用
my_dog = Dog("豆豆", 1)
my_dog.birthday()  # 輸出:豆豆 又長大一歲啦!現在 2 歲。

這就是封裝:把數據(age)和操作(birthday)放在一起,外部只需調用方法,無需關心內部如何實現。

六、類屬性 vs 實例屬性

  • 實例屬性:每個對象獨有(如 nameage)。
  • 類屬性:所有對象共享(定義在方法之外)。
class Dog:
    species = "犬科"  # 類屬性,所有狗都一樣

    def __init__(self, name):
        self.name = name  # 實例屬性

dog1 = Dog("大黃")
dog2 = Dog("小黑")

print(dog1.species)  # 輸出:犬科
print(Dog.species)   # 也可以通過類名訪問