Michael Aaron Safyan が提案するように、モジュールをシングルトンとして使用したいと仮定すると、次のようなことを行うことで、モジュールがメイン コードによってインポートされていなくても機能させることができます (メイン コードまたはインポートするモジュール内)。直接的または間接的に)。これが行うことは、instance
クラス属性を 1 に初期化してから、モジュール オブジェクトをsys.modules
作成されたインスタンスに置き換えることです。
class _MyClass(object):
def foo(self):
print 'foo()'
_MyClass.instance = _MyClass()
import sys
_ref = sys.modules[__name__] # Reference to current module so it's not deleted
sys.modules[__name__] = _MyClass.instance
シングルトンは、クラス ファクトリのクラスのグループ、定数のグループ、構成情報のバンドルなど、1 つのみ (レジストリ) を持つことが理にかなっている場合に、物事の「レジスタ」を実装する便利な方法であることがわかりました。 . 多くの場合、通常の Python モジュールだけで問題ありません。これは、デフォルトsys.modules
では、すでに読み込まれているモジュールがディクショナリにキャッシュされるため、事実上すでにシングルトンになっているためです。
ただし、場合によっては、構築パラメータを渡すことができ、プロパティを持つことができるため、クラス インスタンスが望ましい場合があります。これは、組み込みのモジュール オブジェクトにはないものであり、所有させることもできません。このような制限は、カスタム クラス インスタンスを効果的にモジュール オブジェクトに変換する上記のトリックを使用して回避できます。
クラス インスタンスをモジュール オブジェクトとして使用するというアイデアは、Alex MartelliのActiveStateレシピ「 Constants in Python 」に由来します。