例:
class MyClass: def instance_method(self): print(f"インスタンス: {self}") @classmethod def class_method(cls): print(f"クラス: {cls.__name__}") @staticmethod def static_method(): print("普通の関数") obj = MyClass() obj.instance_method() # selfはobj MyClass.class_method() # clsはMyClass MyClass.static_method() # self/clsはなし
よくある質問:
インスタンス経由でクラスメソッドを呼び出すことができますか?それはクラス経由で呼び出すのと何が違いますか?
答え: はい、クラスメソッドはインスタンスを通じてもクラスを通じても呼び出すことができます。呼び出し元がどこであっても、最初の引数は常にクラスであり、インスタンスではありません。インスタンスを通じて呼び出す場合は、そのクラスがclsとして渡されます。
逸話
プロジェクト内ですべてのファクトリーメソッドを静的メソッド(@staticmethod)にしたが、内部で子クラスの名前を知る必要があり、これは不可能であることがわかりました。cls参照を取得するために@classmethodに修正しました。
逸話
インスタンスの一意のIDを生成するために通常のメソッド(self)を使用しましたが、カウントはすべてのオブジェクトではなく、クラス全体で共有されるべきだったので、クラスメソッドが必要でした。
逸話
開発者はクラスに関連付けられないビジネスロジックをクラス内の静的メソッドに配置しました。他の人はこの関数を見つけることができず、別のクラスのスペースで期待していなかったため、メンテナンスが困難になりました。