AI 會寫 Python 繼承,但你知道為什麼需要繼承嗎?
Python 程式實習|物件導向程式設計(OOP)× 生成式 AI × 智慧養殖
super()。最重要的不是背語法,而是能判斷「什麼時候該繼承,什麼時候不該繼承」。一、AI 都會寫 Class,為什麼還要學繼承?
現在只要向生成式 AI 說:「幫我用 Python 設計智慧養殖池系統」,AI 就可能產生好幾個類別,甚至寫出複雜的繼承架構。但是,類別越多、繼承越深,程式就越好嗎?不一定。
繼承的核心用意,是把共同的資料與行為放在父類別,讓子類別重用並擴充功能。它不是為了炫耀語法,也不是所有程式都必須使用。
二、從三種養殖池理解繼承
假設水井村有三種養殖池:一般養殖池只需記錄資料;智慧養殖池增加溶氧警戒;AI 智慧養殖池增加管理建議。三者都有名稱與溶氧數值,因此可以共用基本設計。
圖:Pond 是父類別;SmartPond 和 AIPond 都直接繼承 Pond。這是示範架構,不表示 AI 功能一定要透過繼承實作。
三、Step 1:建立基本養殖池 Pond
class Pond:
def __init__(self, name, oxygen):
self.name = name
self.oxygen = oxygen
def show_info(self):
print(self.name, "溶氧:", self.oxygen)
Pond 是父類別,負責共同的資料與功能。__init__() 初始化每個物件,self 代表目前操作的物件。
四、Step 2:SmartPond 繼承 Pond
class SmartPond(Pond):
def check_oxygen(self):
if self.oxygen < 5:
return "溶氧偏低"
return "溶氧正常"
pond1 = SmartPond("水井一號池", 4.2)
pond1.show_info()
print(pond1.check_oxygen())
執行結果:
水井一號池 溶氧: 4.2
溶氧偏低
注意:我們沒有在 SmartPond 裡重新寫 __init__() 和 show_info(),卻仍然可以使用它們。這是因為子類別繼承了父類別的功能。
五、Step 3:方法覆寫與 super()
如果 AI 智慧養殖池想改變顯示方式,可以在子類別重新定義同名方法,稱為方法覆寫(Override)。
class AIPond(Pond):
def show_info(self):
print("AI 智慧養殖監控")
super().show_info()
def give_advice(self):
if self.oxygen < 5:
return "建議檢查增氧設備"
return "目前溶氧狀態正常"
pond2 = AIPond("水井二號池", 4.3)
pond2.show_info()
print(pond2.give_advice())
執行結果:
AI 智慧養殖監控
水井二號池 溶氧: 4.3
建議檢查增氧設備
super().show_info() 會呼叫父類別的顯示方法,避免重複撰寫原有功能。此處的「AI 建議」只是規則判斷示例,沒有真正呼叫 AI 模型;溶氧警戒值也僅供教學,實務上須依養殖條件設定。
六、繼承有什麼好處?
| 比較項目 | 不使用繼承 | 使用繼承 |
|---|---|---|
| 共同屬性 | 可能重複定義 | 集中在父類別 |
| 共同方法 | 可能重複撰寫 | 子類別可直接使用 |
| 特殊功能 | 各類別自行設計 | 子類別可擴充 |
| 共同功能修改 | 可能需修改多處 | 可集中修改父類別 |
| 複雜度 | 小型系統直覺 | 階層過深時難維護 |
七、不是所有關係都應該繼承:is-a 與 has-a
SmartPond(Pond) 是合理的示例。適合組合(has-a,擁有):養殖池擁有感測器,但養殖池不是感測器。因此,通常應該讓養殖池包含感測器物件,而不是繼承感測器。
class Sensor:
def __init__(self, value):
self.value = value
class PondWithSensor:
def __init__(self, name, sensor):
self.name = name
self.sensor = sensor
sensor = Sensor(5.8)
pond = PondWithSensor("水井三號池", sensor)
print(pond.name, pond.sensor.value)
這稱為組合(Composition)。判斷類別關係,比記住繼承語法更重要。
八、AI 協作實習:No-AI → AI Pair → Challenge AI
任務 A|No-AI:先自己設計
請畫出 Pond、SmartPond、AIPond 的關係,並說明哪些屬性與方法應該共用。先不要讓 AI 代答。
任務 B|AI Pair:請 AI 比較兩種版本
提示詞:
請以 Python 智慧養殖池系統為例,分別寫出「不使用繼承」與「使用繼承」的版本。兩者需有相同功能,並比較程式重複程度、可讀性、修改成本與擴充性。請保持範例簡單,適合大學生學習。
任務 C|Challenge AI:需求突然改變
新增魚菜共生系統、溫度感測器與 MQTT 資料傳輸。請先判斷:哪些適合繼承?哪些應使用組合?再讓 AI 提供設計方案,並檢查是否過度設計。
九、課後思考:你真的理解繼承了嗎?
- 為什麼
SmartPond沒有寫show_info(),仍能呼叫它? super()在覆寫方法時有什麼用途?- 「養殖池有一個感測器」為什麼不適合使用繼承?
- 如果 AI 幫你設計了五層繼承架構,你會如何判斷是否必要?
十、結語:AI 會寫繼承,但你要會判斷
繼承的價值不是讓程式看起來更厲害,而是重用共同設計、擴充特殊功能,並在適當情況下讓系統更容易維護。當類別之間沒有合理的「是一種」關係時,組合或簡單函式可能更合適。
AI 可以幫你寫出繼承程式,但你必須知道為什麼要繼承,以及什麼時候不應該繼承。
延伸學習:Python、Class、Object、Inheritance、Override、super()、Composition、OOP、AI Pair Programming、AIoT
沒有留言:
張貼留言