一、為什麼需要面向對象?
想象你要開發一個學生管理系統。如果用函數式寫法,你需要分別管理姓名、年齡、成績等數據,邏輯分散且容易出錯。
而面向對象的思想是:把相關的數據和操作封裝在一起,形成一個“學生”對象。這樣代碼更清晰、更易維護、也更容易複用。
二、什麼是類(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 實例屬性
- 實例屬性:每個對象獨有(如
name,age)。 - 類屬性:所有對象共享(定義在方法之外)。
class Dog:
species = "犬科" # 類屬性,所有狗都一樣
def __init__(self, name):
self.name = name # 實例屬性
dog1 = Dog("大黃")
dog2 = Dog("小黑")
print(dog1.species) # 輸出:犬科
print(Dog.species) # 也可以通過類名訪問