シングルトン
シングルトン(Singletonパターンは)オブジェクトを作成するための最良の方法を提供して作成したスキーマを、属します。このモデルは、単一のオブジェクトが作成されていることを保証しながら、独自のオブジェクトを作成するための責任がある単一のクラスを含み、およびオブジェクトにアクセスする唯一の方法を提供します。
特徴:
実施例1クラスの単一のインスタンスを持つことができ
2.単利クラスは、独自のインスタンスを作成する必要があります
3.シングルトンクラスは、他のオブジェクトにこのインスタンスを提供する必要があります
問題を解決するには:
グローバルクラスの使用、破壊設立頻繁に。
使用シナリオ:
インスタンス、時間を節約するシステムリソースの数を制御する必要があります。
作成方法:
インスタンスが作成されていない返された場合はシングルトンクラスのインスタンスは、現在存在するか否かを判断します
実際の使用状況:
1.このようなデータベースへのI / O接続など、あまりにも多くのリソースを消費する必要があるオブジェクトを作成します。
カウンター2.Web、一度、データベース内の最初のシンプルな関心をキャッシュして、すべてのリガに更新されません
スレッドプールの3デザインは、一般的に容易単一の実施の形態では、スレッド制御であります
共有ログファイルは一つだけ動作する場合、またはしない追加コンテンツので、開いたままであるので、ログ適用の4.アプリケーションは、一般に、実施形態の単一モードで何が実現されます。
コードの実装:
1.モジュール
#1モジュール: 「」 " Pythonモジュールは、第一のモジュールに導入され、それは、.pycファイルのファイルを生成し、天然のシングルモードの実施形態である 、第二の時間を導入する際に直接.pycファイルファイルをロードし、およびモジュールのコードが再び実行されることはありません。 したがって、我々は、関連するデータや機能を必要とするが、モジュールで定義されている、あなたはシングルトンオブジェクトのアップを取得することができます。 「」" クラスシングルトン(オブジェクト): DEFのFOO(セルフ): パス シングルトン = シングルトン() #コード上のファイルmysingleton.pyに格納されている、すなわち、オブジェクトはシングルトンオブジェクトであり、他のファイルで直接、このファイルのインポートオブジェクトを使用する #MySingletonインポートシングルトンから
2.メタクラスのメタクラス
#2メタクラスことメタクラス 「」 " 分類タイプが作成1、クラス、自動実行型の__init__メソッドを作成し、クラスのインスタンスメソッドの__call__種類を行っ たクラスオブジェクトによって作成されたオブジェクトが作成され2.自動的に実行__init__方法と同様に、オブジェクト()メソッドは、クラス__call__を行う場合、 「」「 クラスシングルトン(タイプ): 」「」 場合、シングルトンのメタクラス__instanceの__call__メソッドのクラス属性を判断しますNoneに__instance、 クラスがインスタンス化されていない場合、親クラスのメタクラス(メタクラスはサブクラスのタイプである)__call__メソッドのタイプを、呼び出し説明 CLS .__インスタンスに割り当てられている。CLS .__インスタンスがNoneでない場合、 記述されたクラスがインスタンス化された、クラスに格納されたクラスのインスタンスがCLS .__インスタンス、すなわちシングルモードの実施形態は、返された直前の属性。 「」" DEF __init__を(CLS、引数*、** kwargsから) 。CLS __instance = なし スーパー()。__init__(* argsを、** kwargsから) デフ __call__(CLS、* argsを、** kwargsから): もし ない CLS。__instance : CLS。__instance =スーパー()。__call__(* argsを、** kwargsから) リターン CLS。__instanceの クラスはFoo(メタクラス= シングルトン): 合格 foo1の = はFoo() foo2は = はFoo() 印刷(foo1のである foo2は)
3.メソッド__new__を使用します
#3. __new__メソッドの クラスシングルトン(オブジェクト): 「」 " 我々は、オブジェクトをインスタンス化する場合、メソッドは__new__クラスを実行することです(私たちは、デフォルトの呼び出しオブジェクト.__ new__を書いていない)、 インスタンス化オブジェクトは、再度実行クラスの__init__メソッドを、このオブジェクトが初期化されている、 すべての私たちはシングルトンを達成することができ、この基づいて「」 " DEF __new__(CLS、* argsを、** kwargsから): IF ない CLS(はhasattr、' _INSTANCE '): #のキーは、我々はこの同じ_INSTANCEは、オブジェクトを返すたびにインスタンス化されます 。cls._instance =スーパー()__new__ (CLS) リターンcls._instanceの クラス:Fooの(シングルトン) DEF __init__ (セルフ): パス foo1が= フー() foo2は = はFoo() プリント(foo2はである foo1の)
4.デコレータ
#4デコレータ DEF シングルトン(CLS): インスタンス = {} DEF get_singleton(*引数、** kwargsから): IF CLS ません でインスタンス: #は辞書が存在するか否かを判定する インスタンスが[CLS] =のCLS(*引数、* kwargsから*) #がここではFoo()に相当するもの を返す[CLS]インスタンスを 返却get_singleton @Singleton クラスはFoo: 渡し foo1は = はFoo() とfoo2 = はFoo() 印刷(foo1のは、IS)とfoo2