Python では、シングルトン モードは一般的に使用されるソフトウェア デザイン パターンです。このモードの主な目的は、特定のクラスがメモリ内にインスタンス オブジェクトを 1 つだけ持つことができるようにすることです。インスタンス オブジェクトはシングルトン モード メソッドを通じて作成されます。現在のプロセスでは、クラスのインスタンス オブジェクトは 1 つだけです。シングルトン パターンは、1. クラスがロードされるとすぐにオブジェクトを作成する Lazy スタイル、2. 使用されたときのみオブジェクトを作成する Hungry スタイルに分類されます。
シングルトン パターンは、一般的に使用されるソフトウェア デザイン パターンであり、このパターンの主な目的は、特定のクラスのインスタンスが 1 つだけ存在するようにすることです。シングルトン オブジェクトは、システム全体で特定のクラスのインスタンスを 1 つだけ表示したい場合に便利です。
たとえば、サーバー プログラムの構成情報はファイルに保存され、クライアントは AppConfig クラスを通じて構成ファイルの情報を読み取ります。プログラムの実行中に構成ファイルの内容をさまざまな場所で使用する必要がある場合、つまり、AppConfig オブジェクトのインスタンスをさまざまな場所で作成する必要がある場合、複数の AppConfig インスタンス オブジェクトが存在することになります。特に構成ファイルに多くのコンテンツが含まれている場合、メモリ リソースが大幅に浪費されます。実際、AppConfig のようなクラスの場合、プログラムの実行中にインスタンス オブジェクトが 1 つだけ存在することが望まれます。
シングルトン モードには 3 つの主要なポイントがあります: まず、クラスはインスタンスを 1 つだけ持つことができます。2 番目に、このインスタンスを自分で作成する必要があります。3 番目に、これをクラスに提供する必要があります。システム全体を単独で使用する例。
Python では、さまざまな方法を使用してシングルトン パターンを実装できます。
モジュールを使用する
__new__
を使用します。デコレータの使用
#モジュールの使用
#実際、Python のモジュールは自然なシングルトン モードです。
モジュールは初めてインポートされるときに .pyc ファイルを生成するため、2 回目にインポートされるときは、モジュール コードを再度実行せずに .pyc ファイルが直接ロードされます。したがって、シングルトン オブジェクトを取得するには、モジュール内で関連する関数とデータを定義するだけで済みます。
本当にシングルトン クラスが必要な場合は、これを行うことを検討してください:
#tests1.py class MyClass(object): def foo(self): print('MyClass.foo') my_class_obj=MyClass()
上記のコードをファイル test1.py に保存し、次のように使用します:
from .tests1 import my_class_obj my_class_obj.foo()
__new__
クラスのインスタンスを 1 つだけ表示するには、__new__ を使用してインスタンスの作成プロセスを制御します。コードは次のとおりです。 :
class MyClass(object): _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(MyClass, cls).__new__(cls, *args, **kwargs) return cls._instance class HerClass(MyClass): a = 1
上記のコードでは、クラスのインスタンスをクラス変数 _instance に関連付けています。cls._instance が None の場合はインスタンスを作成し、それ以外の場合は cls._instance を直接返します。
実行は次のとおりです:
one = HerClass() two = HerClass() print(one == two) #True print(one is two) #True print(id(one), id(two)) #42818864 42818864
デコレータの使用
デコレータは動的に変更できることがわかっています。クラスまたは関数の機能。ここでは、デコレータを使用してクラスを装飾し、インスタンスを 1 つだけ生成することもできます。コードは次のとおりです:
from functools import wraps def singleton(cls): instances = {} @wraps(cls) def getinstance(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return getinstance @singleton class MyClass(object): a = 1
上記では、内部関数 getinstance を返すデコレータ シングルトンを定義しました。関数は、特定のクラスがディクショナリ インスタンスにあるかどうかを判断します。存在しない場合は、cls がキーとして使用され、cls(*args, **kw) が値としてインスタンスに格納されます。それ以外の場合、instances[cls 』を直接返信させていただきます。
以上がPythonシングルトンパターンとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。