2026年10月31日 星期六

Python 物件導向實戰:智慧養殖監控系統

Python 物件導向實戰:用 Class、繼承、多型與封裝設計一套智慧養殖監控系統

Python 程式實習系列(五)|從水井村智慧養殖情境出發,整合四大物件導向觀念,並透過 No-AI、AI Pair、Challenge AI 練習 AI 協作設計。

一、AI 已經會寫程式,為什麼還要做整合實作?

當 AI 可以一次生成完整的 Python 類別,學習目標就不應只是「打出正確語法」,而是能解釋:哪些資料需要保護?哪些功能應共用?新型養殖池加入時,舊程式是否需要修改?本篇以水井村智慧養殖為情境,從設計到測試建立可執行的入門監控模擬系統。

二、需求分析:先決定系統要做什麼

這是一個離線模擬程式,不連接真實感測器。系統要管理一般池、智慧池與魚菜共生池;各池都有名稱與溶氧。智慧池另外有溶氧警戒值,魚菜共生池再增加水位。系統必須拒絕負數溶氧、允許更新感測數據,並使用同一個迴圈列出不同類型養殖池的狀態。

三、先畫出繼承階層圖

由下圖可見,SmartPond 是 Pond 的一種;AquaponicsPond 又是 SmartPond 的一種。這是為了教學而採用的簡化架構。實務上若魚菜共生池的規則與智慧池差異很大,也可以考慮改用組合而非繼承。
Pondoxygen / check_status() SmartPondlimit / 覆寫 check_status() AquaponicsPondwater_level / 覆寫 check_status() 共同屬性與方法新增警戒規則新增水位監測

圖:教學用的三層繼承階層;三種物件都能呼叫 check_status()。

四、完整 Python 程式:四大觀念一次整合

將下方程式存成 pond_oop_demo.py,以 Python 3 執行。範例不需額外安裝套件。

class Pond:
    def __init__(self, name, oxygen):
        self.name = name
        self.oxygen = oxygen

    @property
    def oxygen(self):
        return self._oxygen

    @oxygen.setter
    def oxygen(self, value):
        if not isinstance(value, (int, float)) or isinstance(value, bool):
            raise TypeError("溶氧必須是數字")
        if not 0 <= value <= 25:
            raise ValueError("溶氧須介於 0~25 mg/L")
        self._oxygen = float(value)

    def check_status(self):
        return f"{self.name}:溶氧 {self.oxygen:.1f} mg/L"


class SmartPond(Pond):
    def __init__(self, name, oxygen, limit=5.0):
        super().__init__(name, oxygen)
        if limit < 0:
            raise ValueError("警戒值不可為負數")
        self.limit = limit

    def check_status(self):
        status = "偏低,請檢查增氧設備" if self.oxygen < self.limit else "正常"
        return f"{self.name}:溶氧 {self.oxygen:.1f} mg/L,{status}"


class AquaponicsPond(SmartPond):
    def __init__(self, name, oxygen, water_level, limit=5.0):
        super().__init__(name, oxygen, limit)
        self.water_level = water_level

    @property
    def water_level(self):
        return self._water_level

    @water_level.setter
    def water_level(self, value):
        if not isinstance(value, (int, float)) or isinstance(value, bool):
            raise TypeError("水位必須是數字")
        if value < 0:
            raise ValueError("水位不可為負數")
        self._water_level = float(value)

    def check_status(self):
        oxygen_status = super().check_status()
        level_status = "水位偏低" if self.water_level < 30 else "水位正常"
        return f"{oxygen_status};{level_status}({self.water_level:.0f} cm)"


ponds = [
    Pond("一般池", 6.1),
    SmartPond("智慧池", 4.2),
    AquaponicsPond("魚菜共生池", 5.8, 25),
]

for pond in ponds:
    print(pond.check_status())

print("\n更新智慧池溶氧後:")
ponds[1].oxygen = 5.6
print(ponds[1].check_status())

print("\n測試不合理資料:")
try:
    ponds[1].oxygen = -1
except ValueError as error:
    print("拒絕更新:", error)

五、執行結果與程式解讀

程式建立三種物件,透過相同的 check_status() 呼叫顯示不同訊息;接著更新智慧池溶氧,最後刻意輸入 -1,確認資料驗證會拒絕不合理數值。

一般池:溶氧 6.1 mg/L
智慧池:溶氧 4.2 mg/L,偏低,請檢查增氧設備
魚菜共生池:溶氧 5.8 mg/L,正常;水位偏低(25 cm)

更新智慧池溶氧後:
智慧池:溶氧 5.6 mg/L,正常

測試不合理資料:
拒絕更新: 溶氧須介於 0~25 mg/L

六、Class、繼承、多型、封裝在哪裡?

觀念程式位置設計意義
Class 類別class Pond組織名稱、溶氧與狀態查詢
Inheritance 繼承SmartPond(Pond)沿用共同資料與方法,再增加警戒功能
Polymorphism 多型pond.check_status()同一呼叫,依物件類型執行不同方法
Encapsulation 封裝@property、@oxygen.setter在公開屬性寫入時檢查資料有效性

七、No-AI → AI Pair → Challenge AI

No-AI:先預測再執行

不使用 AI,畫出三個類別的關係,指出哪一個方法被覆寫;預測三個物件的輸出,並解釋為何負數溶氧被拒絕。

AI Pair:請 AI 當程式碼審查者

提示詞:「請審查這份 Python 智慧養殖監控程式,指出繼承是否合理、封裝是否完整、多型是否有幫助,並提出三項可測試的改善建議。先不要直接重寫程式。」

Challenge AI:新增需求

新增 ShrimpPond,要求不同的溶氧警戒值;再增加溫度屬性與溫度異常警告。學生先畫類別圖、寫測試案例,再請 AI 協助實作。檢查是否能在不修改原本巡覽迴圈的情況下加入新類別。

八、進一步連接 AIoT:從模擬走向真實系統

完成本篇後,可讓 Raspberry Pi Pico W 或 ESP32 負責感測資料取得,再透過 MQTT 或 HTTP 傳送至 Python 程式。此時可以把「感測器資料來源」獨立為物件,讓養殖池類別專注於狀態與規則;避免讓一個類別同時負責網路、資料庫、感測器與警報的全部工作。

九、測試與安全邊界

本篇的溶氧 0~25 mg/L、警戒值 5 mg/L 與水位 30 cm 都是教學示例,不是現場控制建議。真實系統須依物種、設備量測範圍、校正與現場條件決定閾值;感測器斷線、資料缺漏、時間戳記與設備故障也需要另外處理。

此外,Python 的底線屬性是慣例,@property 不是防止惡意修改的安全機制。它主要協助我們維持正常程式使用情境下的資料一致性。

十、結語:AI 寫程式,學生設計系統

Class 讓我們定義物件;繼承讓相似物件共用設計;多型讓不同物件以一致方式操作;封裝則幫助維持資料合理性。真正的學習成果,不只是程式能執行,而是能回答「為什麼這樣設計?」並能在需求改變時提出合理修改。

關鍵字:Python、OOP、Class、Inheritance、Polymorphism、Encapsulation、AIoT、智慧養殖、AI 協作

沒有留言:

張貼留言