ProgrammingPython開発者

Pythonにおけるクラスメソッド(@classmethod)、静的メソッド(@staticmethod)、および通常のインスタンスメソッドの違いを説明してください。どのような場合に何を選ぶべきですか?

Hintsage AIアシスタントで面接を突破

答え。

  • 通常のインスタンスメソッド — 最初の引数としてselfを受け取り、具体的なオブジェクトへの参照を取得します。オブジェクトの状態にアクセス・変更するために使用されます。
  • @classmethod は最初の引数としてclsを受け取り、オブジェクトではなくクラスそのものへの参照を取得します。ファクトリーメソッドやクラス全体に関わるメソッドに適用されます。
  • @staticmethod は暗黙的な引数を一切受け取りません。クラス内に配置された通常の関数であり、論理的にグループ化するために使用されます。

例:

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)を使用しましたが、カウントはすべてのオブジェクトではなく、クラス全体で共有されるべきだったので、クラスメソッドが必要でした。


逸話

開発者はクラスに関連付けられないビジネスロジックをクラス内の静的メソッドに配置しました。他の人はこの関数を見つけることができず、別のクラスのスペースで期待していなかったため、メンテナンスが困難になりました。