Python3.8.1
シングルトンモードは、クラスのインスタンスが1つだけであることを確認するためのものです。システム全体に特定のクラスのインスタンスが1つだけあるようにする場合は、シングルトンモードが便利です。
classMyClass(object):
def foo(self):return None
obj1 =MyClass()
obj2 =MyClass()print(obj1 is obj2)print(id(obj1))print(id(obj2))
classMyClass(object):
def foo(self):return None
obj =MyClass()
使用する:
from singleton.mysingleton import obj
pythonモジュールは、モジュールが初めてインポートされるときに.pycファイルを生成するため、自然なシングルトンモードです。2回目にインポートされると、モジュールコードを再度実行するのではなく、.pycファイルを直接ロードします。モジュール内で関連する関数とデータを定義し、シングルトンオブジェクトを取得できます
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つだけです。つまり、クラスがインスタンス化される前に、最初にクラスがインスタンス化されているかどうかを判断し、インスタンス化されていない場合はインスタンス化します。インスタンス化されている場合、テストは前の値を返します。オブジェクトのインスタンス化
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つの欠点があります。
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__メソッドが呼び出されてオブジェクトが初期化されます。 、これに従ってシングルトンを実装できます