用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的沙龍
167會員
322內容數
本業是影像辨識軟體開發,閒暇時間進修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
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
這篇文章介紹了面試時以及開始工作後可能會遇到的問題,包括物件導向OOP、SOLID 設計原則、測試方式,以及 Cookie、Session 與 Cache 的相似處與不同處。提供了豐富的相關資訊。
Thumbnail
這篇文章介紹了面試時以及開始工作後可能會遇到的問題,包括物件導向OOP、SOLID 設計原則、測試方式,以及 Cookie、Session 與 Cache 的相似處與不同處。提供了豐富的相關資訊。
Thumbnail
本筆記除了以文字說明SOLID設計原則以外,並以Java code實際舉例。 Single Responsibility Principle (SRP) 單一職責原則 每個人負責屬於自己的職責,不該承擔太多職責,大家各自做自己應該做的事情,且不會互相干擾。 續上程式碼,修改如下: Output:
Thumbnail
本筆記除了以文字說明SOLID設計原則以外,並以Java code實際舉例。 Single Responsibility Principle (SRP) 單一職責原則 每個人負責屬於自己的職責,不該承擔太多職責,大家各自做自己應該做的事情,且不會互相干擾。 續上程式碼,修改如下: Output:
Thumbnail
本階段深掘PHP中類別與物件的應用,從基本定義到屬性與方法的運用,並特別著重於訪問控制和靜態成員的概念。學生將學會如何有效地利用公開、保護、私有屬性,以及如何在不實例化的情況下透過類別名稱直接訪問靜態屬性和方法,進一步鞏固物件導向程式設計的核心知識。
Thumbnail
本階段深掘PHP中類別與物件的應用,從基本定義到屬性與方法的運用,並特別著重於訪問控制和靜態成員的概念。學生將學會如何有效地利用公開、保護、私有屬性,以及如何在不實例化的情況下透過類別名稱直接訪問靜態屬性和方法,進一步鞏固物件導向程式設計的核心知識。
Thumbnail
本階段介紹物件導向程式設計(OOP)基礎,從OOP概念、類別與物件基本原理,到PHP中類別與物件的應用,並深入探討封裝、繼承等OOP特性,最後以實際練習加強理解。此階段為學生掌握PHP OOP打下堅實基礎。
Thumbnail
本階段介紹物件導向程式設計(OOP)基礎,從OOP概念、類別與物件基本原理,到PHP中類別與物件的應用,並深入探討封裝、繼承等OOP特性,最後以實際練習加強理解。此階段為學生掌握PHP OOP打下堅實基礎。
Thumbnail
作者:陳華夫 既然,無法淨增加「理工科」學生,我建議從非「理工科」的人口裡,訓練寫AI電腦程式。我前面說過:「寫八股文與AI電腦程式基本上都是在作文,只是前者寫給人看,後者寫給電腦看。」只要個人克服心理障礙及社會提供學習及諮詢資源,則「文科」生轉型寫AI電腦程式,以彌補人工智慧產業人才短缺,不是夢。
Thumbnail
作者:陳華夫 既然,無法淨增加「理工科」學生,我建議從非「理工科」的人口裡,訓練寫AI電腦程式。我前面說過:「寫八股文與AI電腦程式基本上都是在作文,只是前者寫給人看,後者寫給電腦看。」只要個人克服心理障礙及社會提供學習及諮詢資源,則「文科」生轉型寫AI電腦程式,以彌補人工智慧產業人才短缺,不是夢。
Thumbnail
這個單元我一直很想學習,物件導向 Object Oriented Programming 以前一直以為是一種程式碼,其實是設計程式的觀念,文中我分享了程式碼還有自己想的比喻讓讀者更好理解。除了物件導向,我還介紹其他四種風格的程式碼設計,跟大家一起學習。
Thumbnail
這個單元我一直很想學習,物件導向 Object Oriented Programming 以前一直以為是一種程式碼,其實是設計程式的觀念,文中我分享了程式碼還有自己想的比喻讓讀者更好理解。除了物件導向,我還介紹其他四種風格的程式碼設計,跟大家一起學習。
Thumbnail
物件導向(Object-Oriented Programming,OOP) 可以用來提高程式碼的可讀性、可維護性和可擴展性,同時還能夠促進程式的重用和組織。
Thumbnail
物件導向(Object-Oriented Programming,OOP) 可以用來提高程式碼的可讀性、可維護性和可擴展性,同時還能夠促進程式的重用和組織。
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News