Python 单例模式
范桂飓 人气:0一、单例模式
单例模式,实现一个类,并且保证这个类的多次实例化操作,都会只生成同一个实例对象。
二、应用场景
整个系统中只需要存在一个实例对象,其他对象都可以通过访问该对象来获取信息,比如:
- 系统的配置信息对象
- 日志对象
- 数据库操作对象
- 线程池对象
三、编码示例
1.单线程中的单例模式
方式一、重载类构造器
定义:
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))
2.多线程中的单例模式
方式三、重载具有线程锁的类构造器
多线程中的单例模式,需要在__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()
加载全部内容