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):
pass
def test():
b1 = Demo()
b2 = Demo()
print(b1, b2)
class single1:
def __init__(self, cls):
self.cls = cls
self.cls.instance = None
def __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)
import threading
class Demo(object):
_instance_lock = threading.Lock()
def __init__(self):
pass
def __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._instance
def test():
b1 = Demo()
b2 = Demo()
print(b1, b2)
打印结果显示b1和b2的地址一致: