Python中如何使用_new_实现单例模式

2023-12-30 20:38:02

单例模式是一个经典设计模式,简要的说,一个类的单例模式就是它只能被实例化一次,实例变量在第一次实例化时就已经固定。

在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

可以看到,这两个实例的内存地址都相同,而且第一次实例化后变量已经固定了,全局不会再改变。

这就是单例模式的实现。

文章来源:https://blog.csdn.net/hakesashou/article/details/135308895
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。