静的メソッドでいっぱいの Python クラスがあります。これらを生の関数ではなくクラスにパッケージ化することの利点と欠点は何ですか?
7 に答える
ありません。これがモジュールの目的です: 関連する機能をグループ化します。静的メソッドでいっぱいのクラスを使用すると、Javaitis からうんざりします。静的関数を使用するのは、関数がクラスの不可欠な部分である場合だけです。(実際、とにかくクラスメソッドを使いたいと思うでしょう。)
いいえ、それらを機能させて、それらが関連している場合は、独自のモジュールに配置する方がよいでしょう。たとえば、次のようなクラスがあるとします。
class Something(object):
@staticmethod
def foo(x):
return x + 5
@staticmethod
def bar(x, y):
return y + 5 * x
次に、次のようなモジュールを用意することをお勧めします。
# something.py
def foo(x):
return x + 5
def bar(x, y):
return y + 5 * x
そのため、次のように使用します。
import something
print something.foo(10)
print something.bar(12, 14)
名前空間を恐れないでください。;-)
関数が相互に依存している場合、またはグローバルな状態に依存している場合は、3 番目のアプローチも検討してください。
class Something(object):
def foo(self, x):
return x + 5
def bar(self, x, y):
return y + 5 * self.foo(x)
something = Something()
このソリューションを使用すると、別の関数の動作をオーバーライドしたり、コンストラクターを使用して依存関係を注入したりできるため、関数を分離してテストできます。
クラスは、関数呼び出し間で永続化され、個別の方法で参照される必要がある一連のデータ (インスタンス プロパティ) と対話する一連の機能がある場合にのみ役立ちます。
クラスに静的メソッド以外のものが含まれていない場合、そのクラスは単なる構文であり、単純な関数ははるかに明確であり、必要なものがすべて含まれています。
利点がないだけでなく、メソッドでいっぱいのモジュールを使用するよりも処理が遅くなります。Python での静的メソッドの必要性は、Java や C# での静的メソッドよりもはるかに少なく、非常に特殊な場合に使用されます。
私はベンジャミンに同意します。一連の静的メソッドを使用するよりも、おそらく関数を多数使用する必要があります。それらを整理したい場合は、クラスではなくモジュールの使用を検討する必要があります。ただし、コードを OO にリファクタリングする場合は、別の問題です。
機能の性質によります。それらが強く無関係ではなく(それらの間の呼び出しの量が最小限)、状態がない場合は、はい、それらをモジュールにダンプします。ただし、継承を窓の外に放り出しているため、動作を変更する必要がある場合は、自分自身を撃っている可能性があります。したがって、私の答えはおそらくであり、モジュールがメソッドのセットを収集するための最良の方法であると常に仮定するのではなく、特定のシナリオを確認してください。