Python 设计模式创建型单例模式
更新时间:2022年02月15日 10:25:34 作者:范桂飓
这篇文章主要介绍了Python 设计模式创建型单例模式,即Singleton,单例是一种设计模式,应用该模式的类只会生成一个实例,下文详细介绍需要的小伙伴可以参考一下
一、单例模式
单例模式,实现一个类,并且保证这个类的多次实例化操作,都会只生成同一个实例对象。
二、应用场景
整个系统中只需要存在一个实例对象,其他对象都可以通过访问该对象来获取信息,比如:
- 系统的配置信息对象
- 日志对象
- 数据库操作对象
- 线程池对象
三、编码示例
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()
到此这篇关于Python 设计模式创建型单例模式的文章就介绍到这了,更多相关Python 单例模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Python Matplotlib绘制箱型图(箱线图)boxplot的方法详解
箱线图(箱型图)主要作用是发现数据内部整体的分布分散情况,包括上下限、各分位数、异常值等,本文为大家整理了Matplotlib绘制箱型图的所以方法,希望对大家有所帮助2023-05-05解读requests.session()获取Cookies全过程
这篇文章主要介绍了解读requests.session()获取Cookies全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-02-02对python中数据集划分函数StratifiedShuffleSplit的使用详解
今天小编就为大家分享一篇对python中数据集划分函数StratifiedShuffleSplit的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-12-12
最新评论