Pythonシングルトンパターンとは何ですか

(*-*)浩
リリース: 2020-09-18 15:02:57
オリジナル
9433 人が閲覧しました

Python では、シングルトン モードは一般的に使用されるソフトウェア デザイン パターンです。このモードの主な目的は、特定のクラスがメモリ内にインスタンス オブジェクトを 1 つだけ持つことができるようにすることです。インスタンス オブジェクトはシングルトン モード メソッドを通じて作成されます。現在のプロセスでは、クラスのインスタンス オブジェクトは 1 つだけです。シングルトン パターンは、1. クラスがロードされるとすぐにオブジェクトを作成する Lazy スタイル、2. 使用されたときのみオブジェクトを作成する Hungry スタイルに分類されます。

Pythonシングルトンパターンとは何ですか

シングルトン パターンは、一般的に使用されるソフトウェア デザイン パターンであり、このパターンの主な目的は、特定のクラスのインスタンスが 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!