@classmethodの概要

@classmethodは、メソッドがクラス自身を最初の引数(通常cls)として受け取る場合に使います。これはインスタンスではなく、クラスに対して操作を行いたい場合に役立ちます。

class MyClass:
    @classmethod
    def from_string(cls, string_data):
        # クラスメソッドとしての例
        return cls(*string_data.split('-'))

クラスメソッドは、特にファクトリーメソッド(クラスの別のコンストラクタ)として利用されることが多いです。

@staticmethodの概要

一方、@staticmethodは、クラスやインスタンスに依存しない汎用的な関数をクラス内で定義するために使います。これにより、クラスと論理的に関連のある関数をクラス内にまとめることができます。

class MyClass:
    @staticmethod
    def is_valid_data(data):
        # クラスやインスタンスに依存しないメソッド
        return isinstance(data, str)

スタティックメソッドは、インスタンスの状態やクラスの状態に関わらない関数的な処理を行う場合に便利です。

クラスメソッドとスタティックメソッドの違い

@classmethodはクラス自体を操作するメソッドで、例えばクラスの別のコンストラクタやサブクラスでも動作させたい処理に使います。
@staticmethodはクラスやインスタンスの属性に触れない汎用的な処理を行うため、引数にクラスやインスタンスを取りません。 これにより、クラス内部で整理された関連関数を持ちたい場合に使用することが推奨されます。