iT邦幫忙

0

Python 裝飾器 (decorator): @classmethod

  • 分享至 

  • xImage
  •  

class 是用來定義一個物件型態的工具,像是 int、str 一樣,但更靈活,因為你可以完全自定義屬性(資料)和方法(行為)。這使得 class 成為實現面向物件程式設計 (Object-Oriented Programming, OOP) 的基石。

更多有關於class文章:
Python 類別 class
方法解析順序 (MRO, Method Resolution Order)
Python 裝飾器 (decorator): @staticmethod
@classmethod 是 Python 中的一個裝飾器 (decorator),
用來定義類別方法 (class method)。
與一般的實例方法不同,類別方法是直接與類別本身相關聯的,而不是物件實例。

特點

  1. 類別方法的第一個參數是類別本身,約定俗成地命名為 cls。
    • cls 是類別的參考(類似於實例方法中的 self)。
    • 它允許你訪問類別層級的屬性或方法。
  2. 類別方法可以由類別本身或類別的任何實例調用。
  3. 使用 @classmethod 定義的方法,常用於創建類別的輔助功能,例如工廠方法。

語法

class MyClass:
    @classmethod
    def class_method(cls, arg1, arg2):
        # cls 指向類別
        pass

範例 1:訪問類別屬性

class Dog:
    species = "Canine"  # 類別屬性

    @classmethod
    def get_species(cls):
        return cls.species  # 訪問類別屬性

# 類別本身調用
print(Dog.get_species())  # Canine

# 物件實例調用
buddy = Dog()
print(buddy.get_species())  # Canine

範例 2:工廠方法

類別方法常用於創建物件的工廠方法,用來基於不同的輸入創建物件。

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

    @classmethod
    def from_birth_year(cls, name, birth_year):
        # 根據出生年份計算年齡並創建物件
        age = 2024 - birth_year
        return cls(name, age)  # 使用 cls 創建物件

# 使用普通初始化
p1 = Person("Alice", 30)
print(p1.name, p1.age)  # Alice 30

# 使用類別方法初始化
p2 = Person.from_birth_year("Bob", 1995)
print(p2.name, p2.age)  # Bob 29

範例 3:與 @staticmethod 的比較

@staticmethod 是另一個裝飾器,用來定義靜態方法(不需要 self 或 cls)。
裝飾器 使用場景 是否需要 self 或 cls
@classmethod 操作類別屬性,創建工廠方法 需要 cls(代表類別)
@staticmethod 狀態獨立的工具函數 不需要 self 或 cls

範例對比:

class Example:
    counter = 0  # 類別屬性

    @classmethod
    def increment(cls):
        cls.counter += 1  # 操作類別屬性
        return cls.counter

    @staticmethod
    def greet():
        return "Hello!"

print(Example.increment())  # 1
print(Example.greet())      # Hello!

更多有關於class文章:
Python 裝飾器 (decorator): @staticmethod


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言