单例模式,实现一个类,并且保证这个类的多次实例化操作,都会只生成同一个实例对象。

整个系统中只需要存在一个实例对象,其他对象都可以通过访问该对象来获取信息,比如:
定义:
class Singleton(object): _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance = object.__new__(cls, *args, **kwargs) return cls._instance
使用:
if __name__ == '__main__': instance1 = Singleton() instance2 = Singleton() instance3 = Singleton() # 打印出 3 个实例对象的内存地址,判断是否相同。 print(id(instance1)) print(id(instance2)) print(id(instance3))
定义:
def singleton(cls):
_instance = {}
def _singleton(*args, **kargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kargs)
return _instance[cls]
return _singleton
使用:
@singleton
class Singleton(object):
"""单例实例"""
def __init__(self, arg1):
self.arg1 = arg1
if __name__ == '__main__':
instance1 = Singleton("xag")
instance2 = Singleton("xingag")
print(id(instance1))
print(id(instance2))
多线程中的单例模式,需要在__new__ 构造器中使用threading.Lock() 同步锁。
定义:
class Singleton(object): _instance = None _instance_lock = threading.Lock() def __new__(cls, *args, **kwargs): if cls._instance is None: with cls._instance_lock: cls._instance = object.__new__(cls, *args, **kwargs) return cls._instance
使用:
def task(arg): instance = Singleton() print(id(instance), '\n') if __name__ == '__main__': for i in range(3): t = threading.Thread(target=task, args=[i, ]) t.start()