Pythonシングルインスタンスモード

Pythonシングルインスタンス###

#1 周囲##

Python3.8.1

#2 単一インスタンスとは##

シングルトンモードは、クラスのインスタンスが1つだけであることを確認するためのものです。システム全体に特定のクラスのインスタンスが1つだけあるようにする場合は、シングルトンモードが便利です。

#3 シングルインスタンスメソッドを実現する##

#3.1 非単一インスタンス###

classMyClass(object):

 def foo(self):return None

obj1 =MyClass()
obj2 =MyClass()print(obj1 is obj2)print(id(obj1))print(id(obj2))

#3.2 module ###を使用する

classMyClass(object):

 def foo(self):return None

obj =MyClass()

使用する:

from singleton.mysingleton import obj

pythonモジュールは、モジュールが初めてインポートされるときに.pycファイルを生成するため、自然なシングルトンモードです。2回目にインポートされると、モジュールコードを再度実行するのではなく、.pycファイルを直接ロードします。モジュール内で関連する関数とデータを定義し、シングルトンオブジェクトを取得できます

#3.3 デコレータを使用する###

def singleton(cls):"""デコレータ機能"""

 class_instance ={} #インスタンスを受け入れるクラスを定義する

 def singleton_inner(*args,**kwargs):if cls not in class_instance: #クラスがインスタンス化されているかどうかを確認します
   class_instance[cls]=cls(*args,**kwargs) #インスタンス化されていません->インスタンス化->インスタンス化されたオブジェクトを辞書に追加します

  return class_instance[cls] #インスタンス化されたオブジェクトを返す

 return singleton_inner 

@ singleton
classMyClass(object):

 def foo(self):return None

obj1 =MyClass()
obj2 =MyClass()print(obj1 is obj2)print(id(obj1))print(id(obj2))

クラスの前にデコレータを追加します。ここでのデコレータの目的は1つだけです。つまり、クラスがインスタンス化される前に、最初にクラスがインスタンス化されているかどうかを判断し、インスタンス化されていない場合はインスタンス化します。インスタンス化されている場合、テストは前の値を返します。オブジェクトのインスタンス化

#3.4 クラスを使用する###

classMyClass(object):

 def foo(self):return None

 @ classmethod
 def get_instance(cls,*args,**kwargs):"""インスタンス化機能"""if not hasattr(cls,'_instance'):
   cls._instance =cls(*args,**kwargs)return cls._instance

obj1 = MyClass.get_instance()
obj2 = MyClass.get_instance()print(obj1 is obj2)print(id(obj1))print(id(obj2))
obj3 =MyClass()print(id(obj3))

この方法で単一のインスタンスを実装することには、2つの欠点があります。

  1. MyClass.get_instance()のようなサブインスタンス化されたオブジェクトのみが単一のインスタンスを実現できます。MyClass()によってこのようにインスタンス化された場合、単一のインスタンスを実装することはできません。
  2. マルチスレッドの場合、複数のインスタンスが表示される可能性があります。これは、このクラスメソッドget_instance()を呼び出すときに、__ init__関数がインスタンス化プロセス中に長い時間を消費すると、他のスレッドのインスタンス化が発生するためです。あなたが最初にインスタンス化したと思います、これは複数のインスタンスにつながります

#3.5 __new__メソッドを書き直します(推奨)###

classMyClass(object):

 def foo(self):return None

 def __new__(cls,*args,**kwargs):if not hasattr(cls,'_instance'):
   cls._instance =super().__new__(cls)return cls._instance

obj1 =MyClass()
obj2 =MyClass()print(obj1 is obj2)print(id(obj1))print(id(obj2))

オブジェクトのインスタンス化プロセスは、最初にクラスの__new__メソッドを実行することです。記述しない場合、オブジェクトの__new__メソッドがデフォルトで呼び出されてインスタンス化されたオブジェクトが返され、次に__init__メソッドが呼び出されてオブジェクトが初期化されます。 、これに従ってシングルトンを実装できます

Recommended Posts

Pythonシングルインスタンスモード
pythonはどのようにインタラクティブモードに入りますか
PythonはモジュールのCookieインスタンス分析を要求します
pythonインタラクティブモードの基本を学ぶ
Pythonは任意の周波数の正弦波モードを生成します