29

クラスのインスタンスを 2 つ以上必要としない場合は、静的クラスを使用するのが良い方法であると読んだことがあります (Microsoft のページを読んだことがあります)。

Pythonでプログラムを書いています。@classmethodクラスのすべてのメソッドに使用すると、悪いスタイルですか?

4

5 に答える 5

36

一般に、このような使用法は、クラスをまったく使用せずに、モジュール内で関数を使用するだけでより適切に実行できます。

于 2012-04-30T17:48:36.833 に答える
15

実際にクラスにアクセスする必要がない限り、これはひどいスタイルです。

静的メソッド [...] は Python クラスメソッドに変換されません。確かに、多かれ少なかれ同じ効果が得られますが、クラスメソッドの目的は、実際には通常は不可能なことを行うことです [...] (デフォルト以外のコンストラクターを継承するなど)。[...] 静的メソッドの慣用的な翻訳は通常、クラスメソッドや静的メソッドではなく、モジュールレベルの関数です。

ソース

于 2012-04-30T17:49:28.087 に答える
12

私の経験では、クラスを作成することは、いくつかの理由から非常に優れたソリューションです。1 つは、クラスを「通常の」クラスとして使用すること (特に、複数のインスタンスを作成すること) が、思っているよりも頻繁に発生することです。また、すべてのクラスに固執することも合理的なスタイルの選択です。これにより、あなたのコードを読んだり維持したりする他の人、特に非常にOOである場合は、クラスに慣れるでしょう。他の返信で述べたように、実装に「裸の」関数を使用することも合理的です。クラスから始めて、それをシングルトン/Borg パターンにしたいかもしれません (これらをググればたくさんの例があります)。他のニーズを満たすためにクラスを (再) 使用する柔軟性が得られます。「静的クラス」アプローチは、非従来的で非 Pythonic であるため、お勧めしません。

于 2012-04-30T18:00:03.003 に答える
6

これにはいくつかのアプローチがあります。他の人が述べたように、モジュールレベルの関数を使用できます。この場合、モジュール自体がそれらをまとめる名前空間です。状態を追跡する必要がある場合に役立つ別のオプションは、通常のメソッド (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ます)。

于 2012-04-30T17:58:55.127 に答える
0

実際には、静的クラスではなくシングルトン クラスが必要になる場合があります 。Python でシングルトン クラスを作成する

于 2016-04-23T12:03:15.403 に答える