シングルトン
Singletonパターンを生成に関するデザインパターンです。シングルトンパターンクラス初期に一度だけ、そして得られた同じクラスのオブジェクトIDに、複数の呼び出しを提供することを目的の一つだけのインスタンス
などログ、構成に適用されるマルチ
実施形態の方法は、シングルモードのpythonを達成します
- デコレーター
def single(cls):
def singleton(*args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = cls(*args, **kwargs)
return cls._instance
return singleton
@single
class Foo(object):
def __init__(self, a=0, b=0):
print('init=', a + b)
pass
f1 = Foo(1, 2)
f2 = Foo(3, 4)
#
print(f1)
print(f2)
print(id(f1))
print(id(f2))
print(f1 == f2)
init= 3
<__main__.Foo object at 0x000000000297AA20>
<__main__.Foo object at 0x000000000297AA20>
43493920
43493920
True
False
True
import threading
class Singleton(type):
lock = threading.Lock()
def __call__(cls, *args, **kwargs):
with Singleton.lock:
if not hasattr(cls, '_instance'):
cls._instance = super().__call__(*args, **kwargs)
return cls._instance
class Foo(metaclass=Singleton):
def __init__(self, a=0, b=0):
print(a + b)
pass
f1 = Foo(1, 2)
f2 = Foo(3, 4)
#
print(f1)
print(f2)
print(id(f1))
print(id(f2))
print(f1 == f2)
3
<__main__.Foo object at 0x000000000291EFD0>
<__main__.Foo object at 0x000000000291EFD0>
43118544
43118544
True
- __New__修正方法
class Foo(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self, a=0, b=0):
print('init=', a + b)
pass
f1 = Foo(1, 2)
f2 = Foo(3, 4)
print(f1)
print(f2)
print(id(f1))
print(id(f2))
print(f1 == f2)
init= 3
init= 7
<__main__.Foo object at 0x000000000292E710>
<__main__.Foo object at 0x000000000292E710>
43181840
43181840
True
False
True