Singleton
Singleton pattern is a creational design patterns. Singleton pattern class initialization only once, and only one instance of the object to provide, multiple calls to the same class object id resulting
multi applied to logs, configuration, etc.
The method of embodiment achieve single mode python
- Decorator
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__ modification method
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