ホームページ >バックエンド開発 >Python チュートリアル >Python のシングルトン パターン
シングルケースモード
シングルトンモード Pattern) は、一般的に使用されるソフトウェア設計パターンです。このパターンの主な目的は、特定のクラスのインスタンスが 1 つだけ存在するようにすることです。シングルトン オブジェクトは、システム全体で特定のクラスのインスタンスを 1 つだけ表示したい場合に便利です。
たとえば、サーバー プログラムの構成情報はファイルに保存され、クライアントは AppConfig を使用します。 設定ファイルの情報を読み取るクラス。プログラムの実行中に構成ファイルの内容を使用する必要がある場所が多数ある場合、つまり、AppConfig をさまざまな場所で作成する必要があります。 オブジェクト インスタンス。システム内に複数の AppConfig インスタンス オブジェクトが存在することになり、特に構成ファイルに多くのコンテンツが含まれている場合、メモリ リソースが大幅に浪費されます。実際、AppConfig のようなもの このようなクラスの場合、プログラムの実行中にインスタンス オブジェクトが 1 つだけ存在することが望まれます。
Python では、複数のメソッドを使用してシングルトン パターンを実装できます:
モジュールを使用する
__new__ を使用する
デコレーターを使用する
メタクラスを使用する )
モジュールの使用
実際、モジュールが初めてインポートされるときに .pyc が生成されるため、Python モジュールは自然なシングルトン モードです。 ファイルを 2 回目にインポートすると、.pyc が直接ロードされます。 モジュールコードを再度実行せずにファイルを削除します。したがって、シングルトン オブジェクトを取得するには、モジュール内で関連する関数とデータを定義するだけで済みます。本当にシングルトン クラスが必要な場合は、これを行うことを検討してください:
# mysingleton.py class My_Singleton(object): def foo(self): pass my_singleton = My_Singleton()
上記のコードをファイル mysingleton.py に保存し、次のように使用します:
from mysingleton import my_singleton my_singleton.foo()
Use __new__
インスタンスのときのみクラスを作成します。というメッセージが表示される場合、__new__ を使用してインスタンスの作成プロセスを制御できます。コードは次のとおりです。
class Singleton(object): _instance = None def __new__(cls, *args, **kw): if not cls._instance: cls._instance = super(Singleton, cls).__new__(cls, *args, **kw) return cls._instance class MyClass(Singleton): a = 1
上記のコードでは、cls._instance が None の場合、クラスのインスタンスをクラス変数 _instance に関連付けます。インスタンス、それ以外の場合は直接戻ります cls._instance.
実行は次のとおりです:
>>> one = MyClass() >>> two = MyClass() >>> one == two True >>> one is two True >>> id(one), id(two) (4303862608, 4303862608)
デコレーターの使用
デコレーター (デコレーター) がクラスまたは関数の機能を動的に変更できることはわかっています。ここで、デコレータを使用してクラスを装飾し、インスタンスを 1 つだけ生成できるようにすることもできます。コードは次のとおりです。
from functools import wraps def singleton(cls): instances = {} @wraps(cls) def getinstance(*args, **kw): if cls not in instances: instances[cls] = cls(*args, **kw) return instances[cls] return getinstance @singleton class MyClass(object): a = 1
上記では、内部関数 getinstance を返すデコレータ シングルトンを定義しました。クラスは辞書インスタンスにあります 存在しない場合は、cls がキーとして使用され、cls(*args, **kw) が値としてインスタンスに格納されます。それ以外の場合は、直接返されます。 インスタンス[cls]。
メタクラスを使用する
メタクラスはクラスの作成プロセスを制御できます。主に次の 3 つのことを行います:
クラスの作成をインターセプトする
クラスの定義を変更する
Return変更後 シングルトン モードを実装するためにメタクラスを使用するクラス
のコードは次のとおりです。
class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) return cls._instances[cls] # Python2 class MyClass(object): __metaclass__ = Singleton # Python3 # class MyClass(metaclass=Singleton): # pass
概要
Python モジュールは自然なシングルトン モードであり、ほとんどの場合はこれで十分です。デコレーターやメタクラスなどのメソッドも使用できます
上記は Python のシングルトン モードの内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。