ホームページ  >  記事  >  バックエンド開発  >  Python のシングルトン パターン

Python のシングルトン パターン

黄舟
黄舟オリジナル
2017-02-04 16:38:191319ブラウズ

シングルケースモード

シングルトンモード 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) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:Python の正規表現次の記事:Python の正規表現