web-dev-qa-db-ja.com

Pythonの静的クラス

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

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

26
rynd

私の経験では、クラスを作成することは、いくつかの理由で非常に優れたソリューションです。 1つは、クラスを「通常の」クラス(特に、複数のインスタンスを作成)として使用することが、思ったよりも頻繁に発生することです。また、すべてのクラスにこだわるのは妥当なスタイル選択です。これにより、コードを読み、保守する他の人にとって、特にOO-クラスに慣れている場合)が容易になります。他の返信で述べたように、単に '実装のための最低限の機能。クラスから始めて、それをシングルトン/ボーグパターン(これらについてググると多くの例がある)にしたい場合があります。これにより、他のニーズを満たすためにクラスを(再)使用する柔軟性が得られます。私は、「静的クラス」アプローチを非従来型で非Pythonic型であるように推奨します。これにより、読み取りと保守が困難になります。

8
Art Swri

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

33
Gareth Latty

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

静的メソッド[...]は、Python classmethodに変換されません。確かに、結果はほぼ同じですが、クラスメソッドの目的は、実際には通常は不可能です[...](デフォルト以外のコンストラクタの継承のように)[...]静的メソッドの慣用的な変換は、通常、モジュールレベルの関数であり、クラスメソッドや静的メソッドではありません。

ソース

これにはいくつかのアプローチがあります。他の人が述べたように、あなたはモジュールレベルの関数を使うことができます。この場合、モジュール自体がそれらをまとめる名前空間です。状態を追跡する必要がある場合に役立つ別のオプションは、通常のメソッド(selfを取得)でクラスを定義し、そのクラスの単一のグローバルインスタンスを定義して、そのインスタンスメソッドをモジュールの名前空間にコピーすることです。これは、標準ライブラリの「ランダム」モジュールが採用しているアプローチです。pythonディレクトリにあるlib/python2.5/random.pyを見てください。下部には、次のようなものがあります。

# 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を使用することをお勧めします)。

6
Edward Loper

あなたは実際には静的クラスではなくシングルトンクラスを必要とするかもしれません: Pythonでシングルトンクラスを作る

0
Tom Bull