单例模式
单例模式是一种创建型设计模式。单例模式的类只能初始化一次,并只提供一个实例对象,多次调用类所得对象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