Python实现单例模式
使用函数装饰器
def singleton(cls):_instance = {}def inner():if cls not in _instance:_instance[cls] = cls()return _instance[cls]return inner@singleton
class Demo(object):def __init__(self):passdef test():b1 = Demo()b2 = Demo()print(b1, b2)
使用类装饰器
class single1:def __init__(self, cls):self.cls = clsself.cls.instance = Nonedef __call__(self, *args, **kwargs):if not self.cls.instance:self.cls.instance = self.cls(*args, **kwargs)return self.cls.instance@single1
class Demo:def test(self):print("hello world")def test():b1 = Demo()b2 = Demo()print(b1, b2)
基于__new__ 方法实现
import threadingclass Demo(object):_instance_lock = threading.Lock()def __init__(self):passdef __new__(cls, *args, **kwargs):if not hasattr(Demo, "_instance"):with Demo._instance_lock:if not hasattr(Demo, "_instance"):Demo._instance = object.__new__(cls) return Demo._instancedef test():b1 = Demo()b2 = Demo()print(b1, b2)
打印结果显示b1和b2的地址一致:
<demo.Demo object at 0x1103ca980> <demo.Demo object at 0x1103ca980>