4

読みました

そのクラスのインスタンスにアクセスできないので、それと?staticmethodの違いがわかりません。global function

そして、いつ使用する必要がありますstaticmethodか?良い例を挙げることができますか?

4

3 に答える 3

6

グローバル関数と同様に、静的メソッドはそれを含むクラスのインスタンスにアクセスできません。しかし、概念的にはそれを含むクラスに属しています。もう1つの利点は、名前の競合を回避できることです。

関数が特定のクラスで機能するように設計されている場合は、そのクラスの静的メソッドとして作成することをお勧めします。これは凝集と呼ばれます。さらに、この関数が外部で使用されていない場合は、その前にアンダースコアを追加して「プライベート」としてマークすることができます。これは情報隠蔽と呼ばれます(Pythonは実際にはプライベートメソッドをサポートしていません)。経験則として、公開するインターフェースをできるだけ少なくすると、コードがよりクリーンになり、変更される可能性が低くなります。

その関数が複数のモジュールにまたがる多くのクラスの共有ユーティリティとして機能することになっている場合でも、それをグローバル関数にすることは依然として最初の選択肢ではありません。ユーティリティクラスの静的メソッドとして作成するか、特殊なモジュールでグローバル関数にすることを検討してください。この理由の1つは、同様の目的の関数を共通のクラスまたはモジュールに収集することは、別のレベルの抽象化/モジュール化に適していることです(小規模なプロジェクトの場合、これは過剰設計であると主張する人もいます)。もう1つの理由は、名前空間の汚染を減らす可能性があることです。

于 2013-02-20T09:19:06.060 に答える
0

静的メソッドはクラスに含まれています(@MartijnPietersによって指摘された名前空間を追加します)。グローバル関数はそうではありません。

于 2013-02-20T09:15:53.843 に答える
0

IMO は、技術的な問題ではなく、設計上の問題です。ロジックが (インスタンスではなく) クラスに属していると思われる場合は、それを として追加し、staticmethod関連していない場合はグローバル関数として実装します。

例えば:

class Image(object):
    @staticmethod
    def to_grayscale(pixel):
        # ...

IMOはよりも優れています

def to_grayscale(pixel):
    #...

class Image(object):
    # ...
于 2013-02-20T09:21:46.413 に答える