python单例模式的几种实现方式
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
实现单例模式的几种方法
1. 使用模块
其实,python的模块就是天然的单例模式,因为模块在第一次导入的时候,会生成.pyc文件,当第二次导入的时候,就会直接加载.pyc文件,而不是再次执行模块代码.如果我们把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了.
新建一个python模块叫singleton,然后常见以下python文件
class Singleton(object): def foo(self): pass singleton = Singleton()
使用:
from singleton.mysingleton import singleton
2. 使用装饰器
装饰器里面的外层变量定义一个字典,里面存放这个类的实例.当第一次创建的收,就将这个实例保存到这个字典中.
然后以后每次创建对象的时候,都去这个字典中判断一下,如果已经被实例化,就直接取这个实例对象.如果不存在就保存到字典中.
装饰器里面的外层变量定义一个字典,里面存放这个类的实例.当第一次创建的收,就将这个实例保存到这个字典中.
然后以后每次创建对象的时候,都去这个字典中判断一下,如果已经被实例化,就直接取这个实例对象.如果不存在就保存到字典中.
def singleton(cls): _instance = {} def _singleton(*args, **kwargs): if cls not in _instance: _instance[cls] = cls(*args, **kwargs) # 创建一个对象,并保存到字典当中 return _instance[cls] return _singleton @singleton class A(object): a = 1 def __init__(self, x=0): self.x = x print('这是A的类的初始化方法') a1 = A(2) a2 = A(3) print(id(a1), id(a2))
2501057682376 2501057682376
3.基于
知识点:
1> 一个对象的实例化过程是先执行类的
2> 在一个类的
__new__
方法实现的单例模式(推荐使用,方便)知识点:
1> 一个对象的实例化过程是先执行类的
__new__方法
,如果我们没有写,默认会调用object的__new__
方法,返回一个实例化对象,然后再调用__init__方法
,对这个对象进行初始化,我们可以根据这个实现单例.2> 在一个类的
__new__方法中
先判断是不是存在实例,如果存在实例,就直接返回,如果不存在实例就创建.import time class A(): instance=None def __init__(self): pass def __new__(cls, *args, **kwargs): if cls.instance is None: cls.instance=super().__new__(cls) return cls.instance def setup(self): print("Cur time:",time.time()) if __name__ == '__main__': a=A() b=A() print(id(a),id(b)) a.setup() b.setup()
2394818100424 2394818100424 Cur time: 1593963540.9315283 Cur time: 1593963540.9315283