@staticmethod@classmethod の違い

Pythonには、@staticmethod@classmethodという2つのデコレーターがあります。どちらもクラスメソッドを定義する際に使われますが、振る舞いや使いどころが異なります。

@staticmethod

@staticmethodを使うメソッドは、クラスやインスタンスの情報に依存しません。これは単なる関数のように動作し、通常、クラスと関連する機能を提供するために使われます。

class MyClass:
    @staticmethod
    def static_method():
        print("Static method called")

呼び出しはクラスからでもインスタンスからでも可能です。

MyClass.static_method()  # Static method called

@classmethod

@classmethodは、メソッドがクラス自体を引数として受け取り、クラスの状態や他のクラスメソッドにアクセスするために使います。

class MyClass:
    counter = 0
    
    @classmethod
    def increment_counter(cls):
        cls.counter += 1
        return cls.counter

このメソッドはクラス全体に影響を与えます。

print(MyClass.increment_counter())  # 1

使い分け

  • @staticmethod: クラスに関連するが、インスタンスやクラス自体を操作しないメソッドに使う。
  • @classmethod: クラスの状態を操作する場合や、クラスを引数として扱う必要がある場合に使う。

まとめ

@staticmethod@classmethodの使い方を理解することで、クラスの設計をより柔軟に行えます。特に、クラスの状態に依存しない処理をまとめたい場合や、ファクトリメソッドのようにクラスを操作する必要があるときに使い分けが重要です。