AI 會寫 Python Class,但你知道為什麼要用類別嗎?
從水井村智慧養殖池出發,學習 Python 類別、物件、屬性與方法,並用 AI 協作挑戰自己的程式設計能力。
一、AI 都會寫程式了,為什麼還要學 Class?
現在只要對 ChatGPT 或 Gemini 說:「請用 Python 設計智慧養殖池管理系統」,AI 就可能在幾秒鐘內產生包含 class、__init__()、self 的程式。
但是,AI 能寫出程式,不代表我們知道為什麼要這樣設計。大學生需要學習的不只是語法,還包括需求分析、程式架構、驗證與維護。
二、只有一個養殖池,需要 Class 嗎?
假設水井村只有一座養殖池,需要記錄水溫和溶氧:
pond_name = "水井一號池"
temperature = 28.5
oxygen = 5.8
print("養殖池:", pond_name)
print("水溫:", temperature)
print("溶氧:", oxygen)
執行結果:
養殖池: 水井一號池
水溫: 28.5
溶氧: 5.8
這樣寫很簡單,而且完全不需要類別。不是每個 Python 程式都需要 Class。
三、增加到三個、甚至一百個養殖池呢?
pond1_temp = 28.5
pond1_oxygen = 5.8
pond2_temp = 29.1
pond2_oxygen = 4.2
pond3_temp = 27.8
pond3_oxygen = 6.1
當資料量增加,建立大量獨立變數會越來越難管理。你可能想到使用字典:
pond1 = {
"name": "水井一號池",
"temperature": 28.5,
"oxygen": 5.8
}
pond2 = {
"name": "水井二號池",
"temperature": 29.1,
"oxygen": 4.2
}
print(pond1["name"])
print(pond2["oxygen"])
字典已經讓資料更有組織。如果搭配串列與迴圈,也能管理很多養殖池。所以,為什麼還需要類別?
四、養殖池不只有資料,還有行為
養殖池除了保存水溫、溶氧,還要能判斷是否異常。我們先使用函式:
def check_oxygen(oxygen):
if oxygen < 5:
return "溶氧偏低"
return "溶氧正常"
pond1 = {"name": "水井一號池", "oxygen": 5.8}
pond2 = {"name": "水井二號池", "oxygen": 4.2}
print(pond1["name"], check_oxygen(pond1["oxygen"]))
print(pond2["name"], check_oxygen(pond2["oxygen"]))
這種方式沒有錯,對小型程式也很實用。不過,如果每座養殖池都有自己的警戒值、更新方式和操作規則,就可以考慮將資料與相關行為組織在同一個物件中。
五、Class 就像設計藍圖
同一張養殖池設計藍圖,可以建立很多座不同的養殖池。每座池子擁有自己的狀態,但共用相同的操作方式。
設計藍圖
屬性+方法
水井一號池
溶氧 5.8
水井二號池
溶氧 4.2
| 觀念 | 生活化說明 | Python 寫法 |
|---|---|---|
| Class 類別 | 養殖池設計藍圖 | class Pond |
| Object 物件 | 實際的一座養殖池 | pond1 |
| Attribute 屬性 | 水溫、溶氧、名稱 | self.oxygen |
| Method 方法 | 檢查溶氧等操作 | check_oxygen() |
class Pond:
def __init__(self, name, temperature, oxygen):
self.name = name
self.temperature = temperature
self.oxygen = oxygen
def show_info(self):
print("養殖池:", self.name)
print("水溫:", self.temperature)
print("溶氧:", self.oxygen)
def check_oxygen(self):
if self.oxygen < 5:
return "溶氧偏低"
return "溶氧正常"
pond1 = Pond("水井一號池", 28.5, 5.8)
pond2 = Pond("水井二號池", 29.1, 4.2)
pond1.show_info()
print(pond1.check_oxygen())
pond2.show_info()
print(pond2.check_oxygen())
__init__() 是建立物件時執行的初始化方法;self 指向目前正在操作的物件。self.oxygen 是屬性,check_oxygen() 是方法。
六、用一個類別管理多個養殖池
延續上一節的 Pond 類別:
ponds = [
Pond("水井一號池", 28.5, 5.8),
Pond("水井二號池", 29.1, 4.2),
Pond("水井三號池", 27.8, 6.1)
]
for pond in ponds:
print(pond.name, pond.check_oxygen())
水井一號池 溶氧正常
水井二號池 溶氧偏低
水井三號池 溶氧正常
只寫一次類別,就可以建立許多具有各自資料的物件。當共同規則改變時,也能集中修改相關方法。
七、進階:每個養殖池有不同的警戒值
現在增加需求:不同養殖池可以設定不同的溶氧警戒值,並更新感測器讀值。
class Pond:
def __init__(self, name, oxygen, limit):
self.name = name
self.oxygen = oxygen
self.limit = limit
def check_oxygen(self):
if self.oxygen < self.limit:
return "溶氧偏低"
return "溶氧正常"
def update_oxygen(self, value):
self.oxygen = value
pond1 = Pond("水井一號池", 5.8, 5.0)
pond2 = Pond("水井二號池", 4.2, 4.5)
print(pond1.name, pond1.check_oxygen())
print(pond2.name, pond2.check_oxygen())
pond2.update_oxygen(5.2)
print("更新後:", pond2.check_oxygen())
水井一號池 溶氧正常
水井二號池 溶氧偏低
更新後: 溶氧正常
提醒:以上數值與警戒值僅供程式教學,實際養殖系統應依物種及現場條件設定。
八、AI 時代的三階段學習法
任務一:No-AI|先自己分析
暫時不使用 AI。假設需要管理 50 個養殖池,包含名稱、水溫、溶氧與水位。你會選擇大量變數、字典與串列,還是類別?請說明理由。沒有規定一定要選 Class。
任務二:AI Pair|請 AI 提供兩種設計
請使用 Python 設計一個智慧養殖池管理系統,提供兩個版本:第一版使用字典、串列與函式,不使用 Class;第二版使用 Pond 類別。兩個版本都要管理三座養殖池、更新溶氧數值、判斷各池是否低於自己的警戒值。請讓程式容易理解,並比較優缺點。
| 比較項目 | 字典與函式 | Class |
|---|---|---|
| 少量資料 | 簡單直覺 | 可能增加結構 |
| 多個養殖池 | 搭配串列管理 | 建立多個物件 |
| 資料與行為 | 通常分開組織 | 可整合於物件 |
| 擴充與維護 | 取決於程式結構 | 複雜系統可能更有優勢 |
任務三:Challenge AI|需求改變時,誰能做決定?
現在要求每個養殖池新增水位、水溫更新方法及異常警示。先自己決定哪些是屬性、哪些是方法,再請 AI 修改程式。最後檢查它有沒有過度設計。
請檢查目前的 Pond 類別是否有重複程式、不必要的屬性或過度複雜的設計。先提出改善建議,不要直接修改程式,讓我自己判斷。
九、實作挑戰:設計自己的智慧生活類別
- 智慧教室:建立
Classroom,管理教室溫濕度與燈光狀態。 - 智慧農業:建立
Farm,管理土壤濕度與灌溉狀態。 - Pico W 感測器:建立
Sensor,管理感測器編號與最新測量值。 - 智慧商品訂購:建立
Product,管理商品價格、庫存與購買操作。
完成後請回答:「如果不用 Class,我的程式會比較簡單,還是比較複雜?為什麼?」
十、從 Class 走向 AIoT 系統
未來智慧養殖系統可能結合 Raspberry Pi、ESP32、MQTT 與雲端服務,並依實際需求設計以下類別:
Pond:管理養殖池狀態。Sensor:管理感測器資料。MQTTClient:負責 MQTT 訊息收發。AlertManager:負責異常警示。DataLogger:負責儲存歷史資料。
這些只是可能的架構,不是每個系統都必須建立這麼多類別。好的設計應根據需求選擇,而不是為了使用 OOP 而使用 OOP。
十一、結語:AI 會寫 Class,你要會設計 Class
學習 Python 類別,不只是記住 class、__init__()、self,而是要理解何時需要類別、如何分配屬性與方法,以及當需求改變時如何維護程式。
AI 負責加速寫程式,學生負責理解問題、設計架構與驗證結果。
課後思考題:如果 AI 在十秒內寫出包含五個類別的 Python 程式,你如何判斷這五個類別是否真的有必要?