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

Python (231) 2023-06-08 05:35:51

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

在Python中常见的单例模式有None,这就是一个很典型的设计,通常使用 if xxx is None或者if xxx is not None来比较运算。

Python实现单例模式

代码如下:

classMyClass:
_instance=None
_first_init=False
def__new__(cls,*args,**kwargs):
ifnotcls._instance:
cls._instance=super().__new__(cls)
returncls._instance
def__init__(self,var1,var2):
cls=type(self)
ifnotcls._first_init:
self.var1=var1
self.var2=var2
cls._first_init=True

如上所示,我创建了一个MyClass的类,定义了两个类变量,第一个是_instance,它负责保存该类创建的实例。第二个是_first_init,它是一个布尔值,保存是否为第一次实例化该类。

相关推荐:《Python视频教程》

在__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

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

这就是单例模式的实现。

相关推荐:

Python之类方法、__new__方法和__init__方法介绍

THE END

发表回复