読みました
そのクラスのインスタンスにアクセスできないので、それと?staticmethod
の違いがわかりません。global function
そして、いつ使用する必要がありますstaticmethod
か?良い例を挙げることができますか?
読みました
そのクラスのインスタンスにアクセスできないので、それと?staticmethod
の違いがわかりません。global function
そして、いつ使用する必要がありますstaticmethod
か?良い例を挙げることができますか?
グローバル関数と同様に、静的メソッドはそれを含むクラスのインスタンスにアクセスできません。しかし、概念的にはそれを含むクラスに属しています。もう1つの利点は、名前の競合を回避できることです。
関数が特定のクラスで機能するように設計されている場合は、そのクラスの静的メソッドとして作成することをお勧めします。これは凝集と呼ばれます。さらに、この関数が外部で使用されていない場合は、その前にアンダースコアを追加して「プライベート」としてマークすることができます。これは情報隠蔽と呼ばれます(Pythonは実際にはプライベートメソッドをサポートしていません)。経験則として、公開するインターフェースをできるだけ少なくすると、コードがよりクリーンになり、変更される可能性が低くなります。
その関数が複数のモジュールにまたがる多くのクラスの共有ユーティリティとして機能することになっている場合でも、それをグローバル関数にすることは依然として最初の選択肢ではありません。ユーティリティクラスの静的メソッドとして作成するか、特殊なモジュールでグローバル関数にすることを検討してください。この理由の1つは、同様の目的の関数を共通のクラスまたはモジュールに収集することは、別のレベルの抽象化/モジュール化に適していることです(小規模なプロジェクトの場合、これは過剰設計であると主張する人もいます)。もう1つの理由は、名前空間の汚染を減らす可能性があることです。
静的メソッドはクラスに含まれています(@MartijnPietersによって指摘された名前空間を追加します)。グローバル関数はそうではありません。
IMO は、技術的な問題ではなく、設計上の問題です。ロジックが (インスタンスではなく) クラスに属していると思われる場合は、それを として追加し、staticmethod
関連していない場合はグローバル関数として実装します。
例えば:
class Image(object):
@staticmethod
def to_grayscale(pixel):
# ...
IMOはよりも優れています
def to_grayscale(pixel):
#...
class Image(object):
# ...