Python 類別方法完全指南|定義、用法與應用範例詳解

目次

1. 什麼是 Python 類別方法?從基礎開始的易懂解說

在 Python 中,有一種稱為「類別方法」的機制,當你想要對整個類別進行操作時,就可以使用這種方法。類別方法不是針對某個特定的實例(物件),而是針對類別本身進行操作時使用的。
本文將從類別方法的基本概念開始,深入介紹其用法與實際應用方式。

1.1 什麼是 Python 的類別方法?

類別方法是透過 Python 的 @classmethod 裝飾器來定義的,其特色是第一個引數會接收類別本身
一般的實例方法會以 self 作為第一個引數,而類別方法則是使用 cls(代表 class 的縮寫)來接收類別本身。
透過 cls,你可以存取類別變數,甚至操作整個類別

1.2 類別方法的特點

類別方法具有以下幾個特點:

  1. 不需建立實例即可呼叫
  • 一般的實例方法需要先建立類別的實例才能呼叫。但類別方法可以直接從類別本身呼叫,無需建立實例。
  1. 可以操作類別變數
  • 類別方法可以直接操作屬於類別的變數(即類別變數),這讓管理所有實例共用的資料變得更容易。
  1. 可作為工廠方法(Factory Method)使用
  • 類別方法常用於根據特定資料建立類別的實例,也就是所謂的工廠方法

1.3 學習類別方法的好處

理解並善用 Python 的類別方法,可以帶來以下好處:

加深對物件導向程式設計的理解
提升程式碼的可重用性
能有效管理類別層級的變數

1.4 理解類別方法所需的前置知識

1.4.1 Python 的類別與物件

Python 採用物件導向程式設計(OOP)的方式,並透過「類別」這個概念來組織程式碼。

class Car:
    def __init__(self, brand):
        self.brand = brand  # 實例變數

my_car = Car("Toyota")
print(my_car.brand)  # Toyota

1.4.2 selfcls 的差異

要理解類別方法,「selfcls 的差異」是一個非常重要的觀念。

關鍵字作用使用場所
self參照實例(物件)實例方法
cls參照類別本身類別方法

讓我們看看以下這個範例:

class Example:
    class_variable = "類別變數"

    def instance_method(self):
        return "這是實例方法"

    @classmethod
    def class_method(cls):
        return f"類別變數的值: {cls.class_variable}"

# 類別方法可直接呼叫,無需建立實例
print(Example.class_method())  # 類別變數的值: 類別變數

# 實例方法需要先建立實例才能呼叫
example_instance = Example()
print(example_instance.instance_method())  # 這是實例方法

1.5 小結

  • 類別方法是對類別本身作用的方法
  • 使用 @classmethod 裝飾器定義,第一引數為 cls
  • 可以不建立實例,直接呼叫方法
  • 可用來操作類別變數或作為工廠方法使用
  • self 參照實例,cls 則參照類別

2. 如何定義與使用 Python 的類別方法

在上一節中,我們介紹了類別方法的基本概念與其作用。本節將透過實際的程式碼範例,深入說明類別方法如何定義與使用

2.1 類別方法的基本語法

在 Python 中,要定義類別方法需使用 @classmethod 裝飾器。以下是基本語法:

class 類別名稱:
    @classmethod
    def 方法名稱(cls, 引數1, 引數2, ...):
        # 方法的處理邏輯
        return 結果

定義類別方法的重點

  1. 在方法前加上 @classmethod 裝飾器
  2. 第一個引數使用 cls,代表該類別本身
  3. 可以存取類別變數與其他類別方法
  4. 可直接透過類別名稱呼叫(無需建立實例)

2.2 類別方法的實作範例

讓我們來實際定義一個類別方法,並檢查其運作方式:

class Sample:
    class_variable = "類別變數"

    @classmethod
    def class_method(cls):
        print(f"類別方法被呼叫了。類別變數的值: {cls.class_variable}")

# 呼叫類別方法
Sample.class_method()

執行結果

類別方法被呼叫了。類別變數的值: 類別變數

程式碼說明

  • class_variable 是一個類別變數。
  • class_method() 使用了 @classmethod,並透過 cls 來存取變數。
  • 呼叫方式為 Sample.class_method()不需要建立實例即可使用

2.3 類別方法的呼叫方式

類別方法可以透過以下兩種方式來呼叫:

① 直接透過類別名稱呼叫

Sample.class_method()

這是最常見的呼叫方式,適用於執行與整個類別有關的邏輯。

② 透過實例來呼叫

sample_instance = Sample()
sample_instance.class_method()

雖然是透過實例呼叫,但實際上傳入 cls 的仍然是類別本身。

2.4 操作類別變數的類別方法

當你想要變更類別變數時,類別方法非常方便。像是版本資訊或設定值的管理等情境就很適合使用。

class Config:
    version = "1.0"

    @classmethod
    def update_version(cls, new_version):
        cls.version = new_version  # 更新類別變數

# 使用類別方法來更新版本
Config.update_version("2.0")
print(Config.version)  # 2.0

說明

  • update_version() 使用 cls.version修改類別變數
  • 呼叫 Config.update_version("2.0") 後,所有實例都會使用新版本。

2.5 使用類別方法建立實例(工廠方法)

類別方法常用來建立新實例,這類用途稱為工廠方法(Factory Method)

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

    @classmethod
    def from_string(cls, name_str):
        return cls(name_str)  # 使用 cls 建立新的實例

# 使用類別方法建立實例
user = User.from_string("佐藤")
print(user.name)  # 佐藤

說明

  • from_string() 使用 cls(name_str) 來建立新物件。
  • 這種方法可加入資料預處理,比直接呼叫 User("佐藤") 更有彈性。

2.6 與實例方法的差異

比較一般的實例方法與類別方法,它們的差異如下:

方法種類第一個引數呼叫方式影響範圍
實例方法selfinstance.method()單一實例
類別方法clsClass.method()instance.method()整個類別
靜態方法Class.method()像普通函式一樣獨立

類別方法最適合用在與類別整體有關的邏輯處理上。

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

3. Python 類別方法的實際應用(實用案例介紹)

在前面的章節中,我們已經學習了 Python 類別方法的基本概念與用法。
本章將透過實際使用情境,說明類別方法是如何在實務中被靈活運用的。

3.1 類別方法的常見應用模式

類別方法在以下情境中特別實用:

  1. 作為工廠方法使用
  2. 管理設定值與共用資料
  3. 用於修改類別狀態
  4. 靈活運用類別繼承
  5. 簡化資料庫連線與管理

我們將透過實例來逐一說明。

3.2 案例①:作為工廠方法使用

工廠方法是指根據特定格式的資料建立新實例的方法。

以下是一個例子:

從字串資料建立 User 類別的實例

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

    @classmethod
    def from_string(cls, user_info):
        name, age = user_info.split(",")  # 以逗號分隔字串
        return cls(name, int(age))  # 建立新實例

# 使用類別方法建立實例
user = User.from_string("佐藤,30")
print(user.name)  # 佐藤
print(user.age)   # 30

這種方法的好處

  • 可集中管理資料的預處理流程
  • 提升程式碼的可讀性與靈活性
  • 便於擴充,支援不同資料格式(如 JSON、CSV)

3.3 案例②:管理設定值與共用資料

當你想要管理整個應用程式中共用的設定值或預設參數時,類別方法非常有用。

class Config:
    default_language = "Japanese"
    default_theme = "Light"

    @classmethod
    def update_language(cls, new_language):
        cls.default_language = new_language

    @classmethod
    def update_theme(cls, new_theme):
        cls.default_theme = new_theme

# 使用類別方法來修改設定
Config.update_language("English")
Config.update_theme("Dark")

print(Config.default_language)  # English
print(Config.default_theme)     # Dark

這種方法的好處

  • 可以在整個應用中統一管理設定
  • 類別層級的變更會影響所有實例,避免重複設定

3.4 案例③:用於修改類別的狀態

你可以利用類別方法來追蹤類別狀態,例如實例的總數。

class Counter:
    count = 0  # 類別變數(所有實例共用)

    def __init__(self):
        Counter.increment_count()

    @classmethod
    def increment_count(cls):
        cls.count += 1

# 建立實例會增加計數器
c1 = Counter()
c2 = Counter()
c3 = Counter()

print(Counter.count)  # 3

這種方法的好處

  • 可統一管理所有實例共用的狀態
  • 可用來監控實例的建立狀況或做統計

3.5 案例④:靈活運用類別繼承

類別方法可在繼承結構中被覆寫與應用,實現動態與彈性的類別操作

class Animal:
    species = "Unknown"

    @classmethod
    def set_species(cls, new_species):
        cls.species = new_species

class Dog(Animal):
    pass

class Cat(Animal):
    pass

# 為不同子類別設定不同屬性
Dog.set_species("Canine")
Cat.set_species("Feline")

print(Dog.species)    # Canine
print(Cat.species)    # Feline
print(Animal.species) # Unknown(父類別不變)

這種方法的好處

  • 支援多型(Polymorphism)與靈活的子類別設計
  • 可以重複利用父類別的方法,減少程式碼重複

3.6 案例⑤:簡化資料庫連線與管理

在 Web 應用或後端開發中,類別方法可以統一管理資料庫連線的邏輯。

class Database:
    connection = None

    @classmethod
    def connect(cls, db_url):
        if cls.connection is None:
            cls.connection = f"Connected to {db_url}"
        return cls.connection

# 連接資料庫
db1 = Database.connect("mysql://localhost:3306/mydb")
db2 = Database.connect("mysql://localhost:3306/mydb")

print(db1)        # Connected to mysql://localhost:3306/mydb
print(db1 is db2) # True(使用相同的連線)

這種方法的好處

  • 統一管理資料庫連線邏輯,避免重複連線
  • 多個實例共享相同連線(Singleton 模式)

3.7 小結

本章節介紹了類別方法在實際開發中的幾個典型應用場景。

重點整理:

  • 工廠方法:簡化資料預處理與實例建立
  • 設定管理:統一處理整個應用程式的設定資料
  • 類別狀態控制:像是記錄實例數量、版本等
  • 繼承應用:使用 cls,支援彈性的繼承與覆寫
  • 資料庫操作:集中管理連線邏輯,實作 Singleton 模式

4. 類別方法與其他方法的差異(附比較表)

要真正理解 Python 的類別方法,與實例方法和靜態方法的差異是非常重要的。
這三種類型的方式各有其用途,能夠正確使用會讓你的程式更加有效率且易於維護。
本章將透過比較表與範例,來具體說明它們之間的差異。

4.1 Python 中的三種方法

在 Python 類別中,可以定義以下三種類型的方法:

方法類型裝飾器第一個參數可否存取類別變數可否存取實例變數呼叫方式
實例方法self可以可以instance.method()
類別方法@classmethodcls可以不可以Class.method()instance.method()
靜態方法@staticmethod不可以不可以Class.method()instance.method()

以下我們來逐一說明每種方法的用途與範例。

4.2 什麼是實例方法?

實例方法是用來針對每個物件執行不同動作的方法。
它的第一個參數是 self,可以操作該實例的屬性與行為。

實例方法的範例

class Dog:
    def __init__(self, name):
        self.name = name  # 實例變數

    def bark(self):
        return f"{self.name} 在吠叫!"

# 建立兩個實例
dog1 = Dog("小黑")
dog2 = Dog("小白")

print(dog1.bark())  # 小黑 在吠叫!
print(dog2.bark())  # 小白 在吠叫!

重點

使用 self 操作該實例的資料
必須先建立實例才能呼叫

4.3 什麼是類別方法?

類別方法是針對整個類別進行操作的方法。
使用 cls 作為第一個參數,可存取與修改類別變數。

類別方法的範例

class Cat:
    species = "貓科動物"

    def __init__(self, name):
        self.name = name

    @classmethod
    def set_species(cls, new_species):
        cls.species = new_species  # 修改類別變數

# 修改類別變數
Cat.set_species("Felidae")

# 所有實例都反映新的類別變數值
cat1 = Cat("小花")
cat2 = Cat("小黃")

print(cat1.species)  # Felidae
print(cat2.species)  # Felidae
print(Cat.species)   # Felidae

重點

可透過 cls 存取與修改類別變數
適合用來處理類別層級的資料與邏輯
可直接使用 Class.method() 呼叫,無需建立實例

4.4 什麼是靜態方法?

靜態方法(Static Method)是不依賴類別或實例的通用函式,定義在類別中只是為了結構上的整齊與方便管理。
不接收 selfcls,也無法存取任何變數。

靜態方法的範例

class MathHelper:
    @staticmethod
    def add(x, y):
        return x + y

    @staticmethod
    def multiply(x, y):
        return x * y

# 無需建立實例就可呼叫
print(MathHelper.add(3, 5))     # 8
print(MathHelper.multiply(4, 6))  # 24

重點

適用於不使用任何類別或實例資料的輔助函式
可像普通函式一樣使用,但放在類別內以利組織管理
可直接使用 Class.method() 呼叫

4.5 應該使用哪種方法?

選擇適當的方法類型,可依據下表做為參考依據:

方法類型適用情境
實例方法當每個實例需要擁有不同資料與行為時(例如:操作 self.name
類別方法當你需要操作類別層級的資料(例如:設定版本、統計資料)
靜態方法當你需要定義與類別有關但不依賴類別資料的輔助函式(例如:計算、轉換)

4.6 小結

本章節說明了類別方法與其他兩種方法(實例方法、靜態方法)之間的差異與用法。

重點回顧:

  • 實例方法:以 self 為第一參數,用來操作特定實例的資料
  • 類別方法:以 cls 為第一參數,用來處理整個類別的資料
  • 靜態方法:不接收任何預設參數,執行與類別無關的通用邏輯
侍エンジニア塾

5. Python 類別方法的常見問題(FAQ)

在學習 Python 的類別方法時,許多讀者會遇到一些常見的疑問。
本章節將以問與答的方式,針對這些常見問題進行清楚的說明。

5.1 關於類別方法的基本問題

Q1. 什麼時候該使用類別方法?

A. 當你需要撰寫影響整個類別的邏輯時,就應該使用類別方法。
尤其在以下情況中非常實用:

需要修改類別變數時
建立工廠方法來根據特定格式資料產生實例
管理類別狀態(像是計數器、設定值)

Q2. 類別方法與實例方法有什麼不同?

A. 類別方法使用 @classmethod 裝飾器,並以 cls 為第一個參數。
相對地,實例方法以 self 為第一個參數。

方法類型第一參數是否可存取類別變數是否可存取實例變數
實例方法self可以可以
類別方法cls可以不可以

範例(比較)

class Sample:
    class_variable = "類別變數"

    def __init__(self, name):
        self.name = name  # 實例變數

    def instance_method(self):
        return f"實例變數: {self.name}"

    @classmethod
    def class_method(cls):
        return f"類別變數: {cls.class_variable}"

# 實例方法需透過實例呼叫
s = Sample("太郎")
print(s.instance_method())  # 實例變數: 太郎

# 類別方法可直接由類別呼叫
print(Sample.class_method())  # 類別變數: 類別變數

Q3. 類別方法可以存取實例變數嗎?

A. 不可以。
類別方法是設計來操作類別層級的資料,因此無法直接存取實例變數(如 self.name)。
如果需要操作實例的資料,應使用實例方法

5.2 類別方法與靜態方法的差異

Q4. 類別方法與靜態方法有什麼差別?

A. 類別方法(@classmethod)會接收 cls 作為參數,可以操作類別變數。
而靜態方法(@staticmethod)則不接收任何隱含參數,也不能存取類別或實例變數。

方法類型第一參數可否存取類別變數可否存取實例變數
類別方法cls可以不可以
靜態方法不可以不可以

範例(比較)

class Example:
    class_variable = "類別變數"

    @classmethod
    def class_method(cls):
        return f"類別變數的值: {cls.class_variable}"

    @staticmethod
    def static_method():
        return "靜態方法無法存取類別變數"

# 類別方法
print(Example.class_method())  # 類別變數的值: 類別變數

# 靜態方法
print(Example.static_method())  # 靜態方法無法存取類別變數

Q5. 什麼時候該使用靜態方法?

A. 當你想要定義與類別邏輯有關但不依賴任何資料的函式時,靜態方法是最佳選擇。
例如:數學計算、格式轉換等。

class MathUtils:
    @staticmethod
    def add(a, b):
        return a + b

print(MathUtils.add(3, 7))  # 10

5.3 關於實際應用的疑問

Q6. 可以用類別方法建立實例嗎?

A. 可以。
類別方法常被當作工廠方法使用,能從外部資料(如字串、JSON)建立新實例。

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

    @classmethod
    def from_string(cls, user_data):
        name, age = user_data.split(",")
        return cls(name, int(age))

# 從字串建立實例
user = User.from_string("佐藤,30")
print(user.name)  # 佐藤
print(user.age)   # 30

Q7. 不同版本的 Python 對類別方法有差別嗎?

A. 大致相同。
在 Python 3.x 中建議使用 @classmethod 的寫法。
在 Python 3.9 之後,也可搭配型別提示(type hint)使用:

class Sample:
    class_variable: str = "類別變數"

    @classmethod
    def get_class_variable(cls) -> str:
        return cls.class_variable

5.4 小結

本章整理了關於 Python 類別方法的常見問題與解答。

重點回顧:

  • 類別方法適用於管理類別層級的邏輯與資料
  • 類別方法無法存取實例變數
  • 應依需求選擇類別方法或靜態方法
  • 類別方法可作為工廠方法使用,方便實例建立
  • Python 版本變化不大,但可結合型別提示提升可讀性

6. 總結(深入理解類別方法)

到目前為止,我們已經從基礎到實務範例,詳細介紹了 Python 的類別方法。
在本章,我們將回顧所學內容,並整理加深對類別方法理解的重點

6.1 類別方法的要點整理

以下是學習 Python 類別方法後應掌握的主要重點:

類別方法的基本概念

  • 使用 @classmethod 裝飾器來定義
  • 第一個參數為 cls可存取與操作整個類別
  • 可以不建立實例,直接透過 Class.method() 呼叫

類別方法的實務應用

  • 作為工廠方法
    → 從字串或 JSON 資料建立實例
  • 管理設定值或類別變數
    → 如 Config.update_language() 改變應用的全域設定
  • 管理整個類別的狀態
    → 像是計算實例數量、版本管理
  • 靈活設計繼承類別
    → 子類別可根據需求改寫父類別的方法

與其他方法的比較

方法類型裝飾器第一參數可否存取類別變數可否存取實例變數呼叫方式
實例方法self可以可以instance.method()
類別方法@classmethodcls可以不可以Class.method()instance.method()
靜態方法@staticmethod不可以不可以Class.method()instance.method()

6.2 適合使用類別方法的情境

正確使用類別方法可以讓程式更具可讀性與可維護性。以下是適用情境:

📌 想統一實例的建立方式
→ 實作 from_string() 等工廠方法,標準化物件建立流程

📌 需要操作類別變數
→ 像是設定版本、語言、主題等應用層級設定

📌 希望子類別可共用並擴展父類別邏輯
→ 使用 cls 可確保在繼承結構中正常運作

6.3 深入理解類別方法的練習建議

若想更深入掌握類別方法,以下幾點實作建議:

1️⃣ 動手寫程式碼實作練習
→ 自行撰寫簡單類別,加入 @classmethod 測試效果

2️⃣ 觀察框架內的使用方式
→ Django、Flask 等框架中廣泛使用類別方法,值得學習

3️⃣ 與其他方法做比較
→ 思考何時該用實例方法 vs 類別方法 vs 靜態方法

6.4 小結

本文深入介紹了 Python 類別方法的核心概念與應用方式。

✔ 掌握類別方法的基本語法與作用
✔ 學習實際應用技巧,並在合適場景中使用
✔ 清楚區分實例方法、類別方法、靜態方法的差異與用途

能夠熟練使用類別方法,將能幫助你撰寫出更有效率、更易維護的 Python 程式碼
現在就開始實作練習,把這些技巧應用到你的專案中吧!