クラスのインスタンスを 2 つ以上必要としない場合は、静的クラスを使用するのが良い方法であると読んだことがあります (Microsoft のページを読んだことがあります)。
Pythonでプログラムを書いています。@classmethod
クラスのすべてのメソッドに使用すると、悪いスタイルですか?
クラスのインスタンスを 2 つ以上必要としない場合は、静的クラスを使用するのが良い方法であると読んだことがあります (Microsoft のページを読んだことがあります)。
Pythonでプログラムを書いています。@classmethod
クラスのすべてのメソッドに使用すると、悪いスタイルですか?
一般に、このような使用法は、クラスをまったく使用せずに、モジュール内で関数を使用するだけでより適切に実行できます。
実際にクラスにアクセスする必要がない限り、これはひどいスタイルです。
静的メソッド [...] は Python クラスメソッドに変換されません。確かに、多かれ少なかれ同じ効果が得られますが、クラスメソッドの目的は、実際には通常は不可能なことを行うことです [...] (デフォルト以外のコンストラクターを継承するなど)。[...] 静的メソッドの慣用的な翻訳は通常、クラスメソッドや静的メソッドではなく、モジュールレベルの関数です。
私の経験では、クラスを作成することは、いくつかの理由から非常に優れたソリューションです。1 つは、クラスを「通常の」クラスとして使用すること (特に、複数のインスタンスを作成すること) が、思っているよりも頻繁に発生することです。また、すべてのクラスに固執することも合理的なスタイルの選択です。これにより、あなたのコードを読んだり維持したりする他の人、特に非常にOOである場合は、クラスに慣れるでしょう。他の返信で述べたように、実装に「裸の」関数を使用することも合理的です。クラスから始めて、それをシングルトン/Borg パターンにしたいかもしれません (これらをググればたくさんの例があります)。他のニーズを満たすためにクラスを (再) 使用する柔軟性が得られます。「静的クラス」アプローチは、非従来的で非 Pythonic であるため、お勧めしません。
これにはいくつかのアプローチがあります。他の人が述べたように、モジュールレベルの関数を使用できます。この場合、モジュール自体がそれらをまとめる名前空間です。状態を追跡する必要がある場合に役立つ別のオプションは、通常のメソッド (self を取る) を使用してクラスを定義し、その単一のグローバル インスタンスを定義して、そのインスタンス メソッドをモジュールの名前空間にコピーすることです。これは、標準ライブラリの「random」モジュールで採用されているアプローチですlib/python2.5/random.py
。python ディレクトリを参照してください。下部には、次のようなものがあります。
# Create one instance, seeded from current time, and export its methods
# as module-level functions. [...]
_inst = Random()
seed = _inst.seed
random = _inst.random
uniform = _inst.uniform
...
または、説明した基本的なアプローチを取ることもできます (ほとんどの場合@staticmethod
ではなく、使用することをお勧めし@classmethod
ます)。
実際には、静的クラスではなくシングルトン クラスが必要になる場合があります 。Python でシングルトン クラスを作成する