😃

【Python】@classmethodについて

2025/03/10に公開

@classmethodはPythonのデコレータの一つで、インスタンスメソッドではなくクラスメソッドを定義するために使用されます。

通常のインスタンスメソッドは、クラスのインスタンス(オブジェクト)に対して呼び出され、第一引数として自動的にそのインスタンス(慣習的にselfと名付けられる)を受け取ります。一方、クラスメソッドはクラス自体に対して呼び出され、第一引数としてクラス自体(慣習的にclsと名付けられる)を受け取ります。

例えば:

class MyClass:
    count = 0
    
    def __init__(self, name):
        self.name = name
        MyClass.count += 1
    
    def instance_method(self):
        # インスタンスメソッド - selfを通じてインスタンスの属性にアクセス
        return f"インスタンスメソッドが呼ばれました: {self.name}"
    
    @classmethod
    def class_method(cls):
        # クラスメソッド - clsを通じてクラスの属性にアクセス
        return f"クラスメソッドが呼ばれました。現在のインスタンス数: {cls.count}"

クラスメソッドの主な用途:

  1. クラス変数へのアクセスと操作
  2. 代替コンストラクタの実装(異なる方法でインスタンスを生成する場合)
  3. ファクトリーメソッドの実装

例えば、代替コンストラクタとしての使用例:

class Date:
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day
    
    @classmethod
    def from_string(cls, date_string):
        # "YYYY-MM-DD"形式の文字列からインスタンスを作成
        year, month, day = map(int, date_string.split('-'))
        return cls(year, month, day)
    
    @classmethod
    def today(cls):
        # 現在の日付からインスタンスを作成
        import datetime
        d = datetime.datetime.now()
        return cls(d.year, d.month, d.day)

この例では、Dateクラスのインスタンスを作成する方法が複数あります:

  • 通常のコンストラクタ: d = Date(2023, 3, 14)
  • 文字列から: d = Date.from_string("2023-03-14")
  • 今日の日付から: d = Date.today()

Discussion