用Python解釋 物件導向(OOP)

更新 發佈閱讀 8 分鐘

一、物件導向(OOP)到底在解決什麼?

一句話版本:

把「資料 + 行為」包在一起,讓程式像真實世界一樣被理解與維護

沒用 OOP 時(程序式)

user_name = "Tom"
user_age = 20

def say_hi(name):
print(f"Hi {name}")

say_hi(user_name)

問題:

  • 資料跟行為是分散的
  • user 一多,你會開始複製貼上地獄 🔥

用 OOP 的思維

class User:
def __init__(self, name, age):
self.name = name
self.age = age

def say_hi(self):
print(f"Hi {self.name}")
u1 = User("Tom", 20)
u1.say_hi()

👉 User 是一個「概念」

👉 name / age 是它的「狀態」

👉 say_hi() 是它「能做的事」


二、OOP 四大核心概念(超重要)

1️⃣ 封裝(Encapsulation)

外部不該知道的,就不要讓它亂改

class BankAccount:
def __init__(self, balance):
self._balance = balance # 慣例:_ 表示內部用

def deposit(self, amount):
self._balance += amount

def get_balance(self):
return self._balance

好處:

  • 以後要加「不能負數」「記 log」都只改這個 class

2️⃣ 繼承(Inheritance)

共通行為抽到父類,子類只管差異

class Animal:
def speak(self):
pass

class Dog(Animal):
def speak(self):
print("汪")

class Cat(Animal):
def speak(self):
print("喵")

⚠️ 大型專案重點

繼承不要亂用,寧願組合(composition)


3️⃣ 多型(Polymorphism)

animals = [Dog(), Cat()]

for a in animals:
a.speak()

👉 呼叫一樣的方法

👉 行為卻不一樣 👉 UI / Pipeline / Plugin 系統的靈魂


4️⃣ 抽象(Abstraction)

用在「規範介面」,不是寫實作

from abc import ABC, abstractmethod

class DataLoader(ABC):
@abstractmethod
def load(self):
pass
class ImageLoader(DataLoader):
def load(self):
print("load images")

👉 很適合:

  • Plug-in
  • Dash / PyQt / pipeline 架構

(你之前做的 Dash + PyQt 其實超適合這套


三、真的在「大型專案」時,怎麼設計?

❌ 新手最常犯的錯

  1. 一個 class 1000 行
  2. UI 直接寫資料處理
  3. 到處 import *
  4. 沒有邊界,全部互相知道彼此

四、大型專案的核心原則(必背)

🧠 1️⃣ 單一職責(SRP)

一個 class 只負責一件事

class Analyzer:
def load_data(self): ...
def analyze(self): ...
def draw_plot(self): ...
def save_excel(self): ...

class DataLoader: ...
class Analyzer: ...
class Plotter: ...
class ReportWriter: ...

🧱 2️⃣ 分層架構(超重要)

常見 4 層

UI         (PyQt / Dash)

Service (流程、商業邏輯)

Domain (核心物件、規則)

Infrastructure (檔案、DBAPI)

👉 UI 不碰資料細節

👉 資料怎麼來,換方式也不影響上層


🗂️ 3️⃣ 專案目錄結構範例

project/

├── ui/
│ └── main_window.py

├── services/
│ └── analysis_service.py

├── domain/
│ ├── image.py
│ ├── defect.py
│ └── result.py

├── infra/
│ ├── file_loader.py
│ └── logger.py

└── main.py

五、真實專案示例(接近你在做的事)

# domain/result.py
class AnalysisResult:
def __init__(self, defects):
self.defects = defects
# services/analysis_service.py
class AnalysisService:
def __init__(self, loader, analyzer):
self.loader = loader
self.analyzer = analyzer

def run(self, folder):
data = self.loader.load(folder)
return self.analyzer.analyze(data)

👉 這樣你之後

  • 換資料來源
  • 換分析算法
  • 換 UI

都不用重寫整個世界 🌍


六、我給你的「大型專案心法」

🔑 設計前先問這 5 個問題

  1. 這個 class 在現實世界是什麼?
  2. 它「負責」什麼,不負責什麼?
  3. 它需要知道誰?
  4. 如果明天需求改了,哪裡最容易爆?
  5. 這東西能不能被替換?
留言
avatar-img
螃蟹_crab的沙龍
161會員
316內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
螃蟹_crab的沙龍的其他內容
2026/02/01
—— 用一個專案學會流程控制、函式、字串與 API 思維 在這個教學中,我們將透過一個 **「Python 自動氣象播報員」**的小專案,學會多個非常重要的 Python 基礎觀念,包括: ✅ 函式(Function) ✅ 條件判斷(if / elif / else) ✅ 字串處理(Str
2026/02/01
—— 用一個專案學會流程控制、函式、字串與 API 思維 在這個教學中,我們將透過一個 **「Python 自動氣象播報員」**的小專案,學會多個非常重要的 Python 基礎觀念,包括: ✅ 函式(Function) ✅ 條件判斷(if / elif / else) ✅ 字串處理(Str
2025/11/13
許多開發者在 Windows 上安裝了多個 Python 版本(例如 3.8、3.11、WinPython 3.12 等), 卻常常遇到「到底現在執行的是哪個 Python?」的困惑。 甚至有時候明明沒有把某個版本加入環境變數(PATH), 但在該資料夾中執行 python 時,卻發現系統竟然
2025/11/13
許多開發者在 Windows 上安裝了多個 Python 版本(例如 3.8、3.11、WinPython 3.12 等), 卻常常遇到「到底現在執行的是哪個 Python?」的困惑。 甚至有時候明明沒有把某個版本加入環境變數(PATH), 但在該資料夾中執行 python 時,卻發現系統竟然
2025/10/30
💻 在同一台電腦上讓程式互通:TCP/IP Socket 原理與實作 🧠 一、為什麼同一台電腦也能用 TCP/IP 通訊? 很多人以為 TCP/IP 只用在「跨網路」的通訊,其實不然。 TCP/IP 是一種協定(Protocol),而非實體連線。 Windows、macOS、Linux
Thumbnail
2025/10/30
💻 在同一台電腦上讓程式互通:TCP/IP Socket 原理與實作 🧠 一、為什麼同一台電腦也能用 TCP/IP 通訊? 很多人以為 TCP/IP 只用在「跨網路」的通訊,其實不然。 TCP/IP 是一種協定(Protocol),而非實體連線。 Windows、macOS、Linux
Thumbnail
看更多
你可能也想看
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
這個單元我一直很想學習,物件導向 Object Oriented Programming 以前一直以為是一種程式碼,其實是設計程式的觀念,文中我分享了程式碼還有自己想的比喻讓讀者更好理解。除了物件導向,我還介紹其他四種風格的程式碼設計,跟大家一起學習。
Thumbnail
這個單元我一直很想學習,物件導向 Object Oriented Programming 以前一直以為是一種程式碼,其實是設計程式的觀念,文中我分享了程式碼還有自己想的比喻讓讀者更好理解。除了物件導向,我還介紹其他四種風格的程式碼設計,跟大家一起學習。
Thumbnail
這篇文章介紹了面試時以及開始工作後可能會遇到的問題,包括物件導向OOP、SOLID 設計原則、測試方式,以及 Cookie、Session 與 Cache 的相似處與不同處。提供了豐富的相關資訊。
Thumbnail
這篇文章介紹了面試時以及開始工作後可能會遇到的問題,包括物件導向OOP、SOLID 設計原則、測試方式,以及 Cookie、Session 與 Cache 的相似處與不同處。提供了豐富的相關資訊。
Thumbnail
物件導向(Object-Oriented Programming,OOP) 可以用來提高程式碼的可讀性、可維護性和可擴展性,同時還能夠促進程式的重用和組織。
Thumbnail
物件導向(Object-Oriented Programming,OOP) 可以用來提高程式碼的可讀性、可維護性和可擴展性,同時還能夠促進程式的重用和組織。
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
本階段深掘PHP中類別與物件的應用,從基本定義到屬性與方法的運用,並特別著重於訪問控制和靜態成員的概念。學生將學會如何有效地利用公開、保護、私有屬性,以及如何在不實例化的情況下透過類別名稱直接訪問靜態屬性和方法,進一步鞏固物件導向程式設計的核心知識。
Thumbnail
本階段深掘PHP中類別與物件的應用,從基本定義到屬性與方法的運用,並特別著重於訪問控制和靜態成員的概念。學生將學會如何有效地利用公開、保護、私有屬性,以及如何在不實例化的情況下透過類別名稱直接訪問靜態屬性和方法,進一步鞏固物件導向程式設計的核心知識。
Thumbnail
本階段介紹物件導向程式設計(OOP)基礎,從OOP概念、類別與物件基本原理,到PHP中類別與物件的應用,並深入探討封裝、繼承等OOP特性,最後以實際練習加強理解。此階段為學生掌握PHP OOP打下堅實基礎。
Thumbnail
本階段介紹物件導向程式設計(OOP)基礎,從OOP概念、類別與物件基本原理,到PHP中類別與物件的應用,並深入探討封裝、繼承等OOP特性,最後以實際練習加強理解。此階段為學生掌握PHP OOP打下堅實基礎。
Thumbnail
本筆記除了以文字說明SOLID設計原則以外,並以Java code實際舉例。 Single Responsibility Principle (SRP) 單一職責原則 每個人負責屬於自己的職責,不該承擔太多職責,大家各自做自己應該做的事情,且不會互相干擾。 續上程式碼,修改如下: Output:
Thumbnail
本筆記除了以文字說明SOLID設計原則以外,並以Java code實際舉例。 Single Responsibility Principle (SRP) 單一職責原則 每個人負責屬於自己的職責,不該承擔太多職責,大家各自做自己應該做的事情,且不會互相干擾。 續上程式碼,修改如下: Output:
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News