Python中使用__new__实现单例模式并解析
程序员文章站
2022-04-15 15:13:35
阅读文章前请先阅读 "Python中类方法、__new__方法和__init__方法解析" 单例模式是一个经典设计模式,简要的说,一个类的单例模式就是它只能被实例化一次,实例变量在第一次实例化时就已经固定。 在Python中常见的单例模式有None,这就是一个很典型的设计,通常使用 或者 来比较运算 ......
阅读文章前请先阅读 python中类方法、__new__方法和__init__方法解析
单例模式是一个经典设计模式,简要的说,一个类的单例模式就是它只能被实例化一次,实例变量在第一次实例化时就已经固定。
在python中常见的单例模式有none,这就是一个很典型的设计,通常使用 if xxx is none
或者if xxx is not none
来比较运算。
python实现单例模式
代码如下:
class myclass: _instance = none _first_init = false def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super().__new__(cls) return cls._instance def __init__(self, var1, var2): cls = type(self) if not cls._first_init: self.var1 = var1 self.var2 = var2 cls._first_init = true
如上所示,我创建了一个myclass
的类,定义了两个类变量,第一个是_instance
,它负责保存该类创建的实例。第二个是_first_init
,它是一个布尔值,保存是否为第一次实例化该类。
在__new__
方法中(构造函数),判断是否存在_instance
这个类变量,如果之前已经实例化了,直接返回。如果是第一次实例化,就会为_instance
类变量绑定实例,使用super().__new__(cls)
创建实例,即调用父类object.__new__(myclass)
创建实例。
在__init__
方法中(初始化函数),我们通过cls=type(self)
获取myclass类,判断是否第一次实例化。如果是第一次实例化,就绑定实例变量。否则什么都不做。
运行效果
我们创建两个实例,来对比
>>> instance1 = myclass(1, 2) >>> instance2 = myclass(7, 5) >>> id(instance1) == id(instance2) true >>> instance2.var1 1
可以看到,这两个实例的内存地址都相同,而且第一次实例化后变量已经固定了,全局不会再改变。
这就是单例模式的实现。
上一篇: php中将html中的br换行符转换为文本输入中的换行符
下一篇: 封装和@property