一、先說結論(先救腦袋)
很多人一開始學 Python 都會問:
「
「不用class是不是一定等於 OOP?」class是不是就不專業?」
✅ 正確答案是:
Python 的class主要是用來實現 OOP,但在實務中,很多class並不是在玩「完整 OOP」。
class 是一種 工具,不是信仰。
二、如果不用 class,世界會怎樣?
先看一個不用 class 的例子:
def get_weather(city):
return 25
def get_advice(temp):
if temp > 30:
return "很熱"
return "還好"
temp = get_weather("Taipei")
advice = get_advice(temp)
這樣寫 完全沒問題,而且:
- 好讀
- 好測試
- 好改
👉 那為什麼還要 class?
三、class 出現,是為了解決「複雜度」
問題來了 👇
如果你的程式開始變成這樣:
- 有很多相關的資料
- 有很多行為「一定要搭配那些資料」
- 狀態會改變
- 邏輯會一直擴充
你會開始看到這種狀況:
temp = 25
humidity = 70
city = "Taipei"
def print_report(temp, humidity, city): ...
def save_report(temp, humidity, city): ...
def get_advice(temp, humidity): ...
👀 參數越來越多,開始痛了
四、class 的核心概念:把東西「包在一起」
這就是 class 最核心的價值
class WeatherReport:
def __init__(self, city, temp, humidity):
self.city = city
self.temp = temp
self.humidity = humidity
def get_advice(self):
if self.temp > 30:
return "很熱"
return "還好"
def print_report(self):
print(self.city, self.temp, self.humidity)
👉 資料 + 行為
👉 綁在一起
👉 這就叫 封裝(Encapsulation)
五、OOP 四大概念(但要用「人話」)
1️⃣ 封裝(Encapsulation)— 最重要
把「資料」跟「操作資料的方法」放在一起
report.get_advice()
你不用知道裡面怎麼算
你只要知道「我可以這樣用」
2️⃣ 繼承(Inheritance)— 最容易被濫用
class BaseAnalyzer:
def analyze(self):
pass
class ImageAnalyzer(BaseAnalyzer):
def analyze(self):
...
⚠️ 真實世界提醒:
能不用繼承,就不要用繼承
很多大型專案 寧願用組合(composition)
一句話先記住(超重要)
組合(composition)=「我 有 一個功能」
繼承(inheritance)=「我 是 一種東西」
而大型專案 討厭「我是」,偏好 「我有」。
繼承為什麼在大型專案容易爆?
問題 1:強耦合
class BaseAnalyzer:
def load(self): ...
def analyze(self): ...
def save(self): ...
class ImageAnalyzer(BaseAnalyzer):
...
💥 問題來了:
- BaseAnalyzer 一改
- 所有子類一起炸
- 很難只改「一小部分行為」
3️⃣ 多型(Polymorphism)— 真正實用的地方
for analyzer in analyzers:
analyzer.analyze()
👉 同一個介面
👉 不同實作
👉 Plugin / Pipeline 的靈魂
4️⃣ 抽象(Abstraction)— 規定「你該怎麼做」
from abc import ABC, abstractmethod
class Analyzer(ABC):
@abstractmethod
def analyze(self):
pass
👉 很適合大型專案
👉 但小專案不用硬上
六、重要觀念:不是所有 class 都是「OOP」
Python 裡 class 常見三種角色
🧺 1️⃣ 當資料容器(超常見)
from dataclasses import dataclass
@dataclass
class Config:
debug: bool
api_key: str
👉 幾乎沒有 OOP
👉 只是「結構化資料」
🧠 2️⃣ 當有狀態的物件
class Counter:
def __init__(self):
self.count = 0
def inc(self):
self.count += 1
👉 不複雜
👉 但很合理
🧰 3️⃣ 當 Service / Manager
class WeatherService:
def fetch(self, city):
...
👉 業界超多這種
👉 沒繼承、沒多型
👉 但非常實用
七、什麼時候「該用 class」?
✅ 用這張檢查表
如果你有 3 個以上,就該考慮 class:
- 有狀態要保存
- 行為和資料密不可分
- 之後會擴充
- 需要被測試 / mock
- 不同實作共用介面
八、什麼時候「不要用 class」?
❌ 純計算
❌ 沒有狀態
❌ 一次性腳本
❌ 為了看起來高級
def add(a, b):
return a + b
👉 這就是最好的寫法
九、給初學者最重要的一句話
先寫好 function
再考慮要不要變成 class
真正專業的工程師,不是「一開始就 OOP」,
而是 知道什麼時候該抽象。
十、總結
class是工具,不是目標- OOP 是為了管理複雜度
- Python 很自由,不需要教條式 OOP
- 好程式碼的標準是:
👉 好讀、好改、好除錯






