[Python基礎]裝飾器classmethod定義類別方法

更新於 發佈於 閱讀時間約 7 分鐘

在使用類別創建實例時,輸入的屬性的都要定義好資料型態,例如dog_1 = Dog("Buddy", 3),有沒有輸入一段字串讓他自己判斷的方法阿?

有的就是使用classmethod:

classmethod 是一種裝飾器,它用於定義類別方法。類別方法與實例方法不同,它們被綁定到類別而不是實例。通常,類別方法的第一個參數是 cls(代表類別本身),而不是 self

語法

class MyClass:
class_variable = "class_var"

@classmethod
def class_method(cls, arg1, arg2):
# 可以使用 cls 訪問類別變數
print(cls.class_variable)
# 其他邏輯...

使用方式:

# 通過類別調用
MyClass.class_method(arg1, arg2)
# 通過實例調用也可,但通常建議使用類別調用
my_instance = MyClass()
my_instance.class_method(arg1, arg2)

程式範例

通過類別調用類別方法

Dog 類別直接調用了類別方法 display_total_dogs,並顯示了總共創建了多少個 Dog 實例

class Dog:
total_dogs = 0

def __init__(self, name):
self.name = name
Dog.total_dogs += 1

@classmethod
def display_total_dogs(cls):
# cls 代表類別本身
print(f"Total dogs: {cls.total_dogs}")

# 創建幾個 Dog 的實例
dog1 = Dog("Buddy")
dog2 = Dog("Charlie")

# 通過類別調用類別方法
Dog.display_total_dogs() # 輸出: Total dogs: 2

直接從一個字符串創建 Dog 實例

統一創建實例: 使用 @classmethod 可以將相關的創建邏輯放在類別中,使得所有創建實例的方法都可以統一管理。這樣有利於程式碼的組織和維護。

直接輸入一段字串"Charlie,5"就可以創建一個實例,創建的程式邏輯都由類別方法來決定。

class Dog:
total_dogs = 0

def __init__(self, name, age):
self.name = name
self.age = age
Dog.total_dogs += 1

@classmethod
def create_from_string(cls, dog_string):
name, age = dog_string.split(",")
# 使用類別方法創建實例
return cls(name, int(age))

def display_info(self):
print(f"{self.name} is {self.age} years old.")

# 使用 __init__ 創建 Dog 實例
dog1 = Dog("Buddy", 3)
dog1.display_info() # 輸出: Buddy is 3 years old.

# 使用 @classmethod 創建 Dog 實例
dog_from_string = Dog.create_from_string("Charlie,5")
dog_from_string.display_info() # 輸出: Charlie is 5 years old.

# 顯示總共創建了多少個 Dog 實例
print(Dog.total_dogs) # 輸出: 2

這樣會想,那我使用__init__的方式來創建實例不就好了,但如果是要創建的物件屬性更複雜的話呢?

我們稍微來增加一下判斷的邏輯,若超過10歲我們就定義狀態為老狗,小於10歲就是年輕的狗。

若用__init__的方式來創建,我還要先定義好狀態是'年輕的',但使用 @classmethod的方式,跟上一個範例一樣是同個字串,讓類別方法根據程式邏輯自己判斷,這樣使用上是不是感覺更靈活了呢。

class Dog:
total_dogs = 0

def __init__(self, name, age, state):
self.name = name
self.age = age
self.state = state
Dog.total_dogs += 1

@classmethod
def create_from_string(cls, dog_string):
name, age_str = dog_string.split(",")

# 在創建實例之前,可以進行更複雜的處理,例如處理年齡字符串
age = int(age_str.strip())

# 如果年齡超過10歲,就將年齡設為10歲
state = '老' if age > 10 else '年輕的'

# 使用類別方法創建實例
return cls(name, age, state)

def display_info(self):
print(f"{self.name} 已經 {self.age} 歲,是{self.state}狗")

# 使用 __init__ 創建 Dog 實例
dog1 = Dog("Buddy", 3 ,'年輕的')
dog1.display_info() # 輸出: Buddy 已經 3 歲,是年輕的狗

# 使用 @classmethod 創建 Dog 實例
dog_from_string = Dog.create_from_string("Charlie, 15 ")
dog_from_string.display_info() # 輸出: Charlie 已經 15 歲,是老狗

# 顯示總共創建了多少個 Dog 實例
print(Dog.total_dogs) # 輸出: 2

@classmethod 提供了一個在整個類別中共享邏輯和更靈活的實例創建方式的機制,使得類別更具有彈性和可擴展性。


有機會在來談論比較複雜的案例,先把觀念搞清楚比較重要






留言
avatar-img
留言分享你的想法!
螃蟹_crab-avatar-img
發文者
2024/01/27
[Python基礎]裝飾器property 將一個方法轉換為屬性提及了這篇文章,趕快過去看看吧!
小松鼠-avatar-img
2024/01/26
很棒 最後寫完集合在一起就是一本python電子書
avatar-img
螃蟹_crab的沙龍
147會員
273內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
螃蟹_crab的沙龍的其他內容
2025/04/25
在 Python 中,字典(dict)是非常常用的資料結構,用來儲存 key-value 配對。而在操作字典時,.setdefault() 是一個常被忽略但非常實用的方法。 這篇文章會完整介紹 .setdefault() 的語法、用途、與實務範例,幫助你更有效率地處理字典資料。 什麼是 .se
Thumbnail
2025/04/25
在 Python 中,字典(dict)是非常常用的資料結構,用來儲存 key-value 配對。而在操作字典時,.setdefault() 是一個常被忽略但非常實用的方法。 這篇文章會完整介紹 .setdefault() 的語法、用途、與實務範例,幫助你更有效率地處理字典資料。 什麼是 .se
Thumbnail
2025/01/30
Python 程式在電腦上的執行流程 當我們在電腦上執行 Python 程式時,主要經歷以下幾個步驟: 1. 編寫 Python 程式碼 開發者使用文字編輯器或 IDE(如 VS Code、PyCharm)撰寫 Python 程式,並將其存為 .py 檔案。 例如,一個簡單的 Python
Thumbnail
2025/01/30
Python 程式在電腦上的執行流程 當我們在電腦上執行 Python 程式時,主要經歷以下幾個步驟: 1. 編寫 Python 程式碼 開發者使用文字編輯器或 IDE(如 VS Code、PyCharm)撰寫 Python 程式,並將其存為 .py 檔案。 例如,一個簡單的 Python
Thumbnail
2024/10/17
在一個典型的程式專案中,UI、Controller 和 Main 的分工通常遵循 MVC 模型(Model-View-Controller) 的架構,這是一種常見的設計模式,能夠將應用程式的邏輯和界面進行分離。 大部分典型的程式專案設計: UI (View):專注於用戶界面,展示數據,並將用
Thumbnail
2024/10/17
在一個典型的程式專案中,UI、Controller 和 Main 的分工通常遵循 MVC 模型(Model-View-Controller) 的架構,這是一種常見的設計模式,能夠將應用程式的邏輯和界面進行分離。 大部分典型的程式專案設計: UI (View):專注於用戶界面,展示數據,並將用
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
本章節是一個初級的 TypeScript 教學,主要介紹了 TypeScript 中物件導向程式設計的各種核心概念,包括類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等。每個概念都通過詳細的解釋和實例代碼來進行深入的介紹。
Thumbnail
本章節是一個初級的 TypeScript 教學,主要介紹了 TypeScript 中物件導向程式設計的各種核心概念,包括類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等。每個概念都通過詳細的解釋和實例代碼來進行深入的介紹。
Thumbnail
本章節旨在介紹JavaScript中的物件導向編程。內容包括類別(Class)的定義和使用,建構子的作用,以及公開,私有,受保護(Protected)等不同訪問修飾符的概念。此外,還涵蓋了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型、反射等物件導向的主要觀念。
Thumbnail
本章節旨在介紹JavaScript中的物件導向編程。內容包括類別(Class)的定義和使用,建構子的作用,以及公開,私有,受保護(Protected)等不同訪問修飾符的概念。此外,還涵蓋了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型、反射等物件導向的主要觀念。
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
Thumbnail
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
Thumbnail
先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
Thumbnail
先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
Thumbnail
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
Thumbnail
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
Thumbnail
在使用類別創建實例時,輸入的屬性的都要定義好資料型態,例如dog_1 = Dog("Buddy", 3),有沒有輸入一段字串讓他自己判斷的方法阿? 有的就是使用classmethod: classmethod 是一種裝飾器,它用於定義類別方法。類別方法與實例方法不同,它們被綁定到類別而不是實例。
Thumbnail
在使用類別創建實例時,輸入的屬性的都要定義好資料型態,例如dog_1 = Dog("Buddy", 3),有沒有輸入一段字串讓他自己判斷的方法阿? 有的就是使用classmethod: classmethod 是一種裝飾器,它用於定義類別方法。類別方法與實例方法不同,它們被綁定到類別而不是實例。
Thumbnail
當你想讓原本函式新增其他功能,又不想更動原本函式時,Python提供了一種強大而靈活的工具,那就是裝飾器。 但對於新手來說這個裝飾器,非常抽象難以理解,讓我們繼續往下看,慢慢的抽絲剝繭吧。 在 Python 中,使用「@」當做裝飾器使用的語法糖符號
Thumbnail
當你想讓原本函式新增其他功能,又不想更動原本函式時,Python提供了一種強大而靈活的工具,那就是裝飾器。 但對於新手來說這個裝飾器,非常抽象難以理解,讓我們繼續往下看,慢慢的抽絲剝繭吧。 在 Python 中,使用「@」當做裝飾器使用的語法糖符號
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News