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

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

在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

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

这就是单例模式的实现。

相关推荐
前端Hardy5 分钟前
HTML&CSS:超有趣的登录表单
javascript·css·html
Leo来编程7 分钟前
Pycharm常用快捷键总结
ide·python·pycharm
Peter_chq7 分钟前
selenium快速入门
linux·开发语言·chrome·python·selenium
陈奕迅本讯9 分钟前
前端-Vue2组件化编程
前端·javascript·vue.js
T - mars10 分钟前
python爬虫:喜马拉雅案例(破解sign值)
javascript·爬虫·python
十五_在努力10 分钟前
参透 JavaScript —— 异步编程与Promise
前端·javascript·promise
十五_在努力15 分钟前
参透 JavaScript —— 图解 Event Loop 事件循环
前端·javascript
Loving_enjoy22 分钟前
从响应式编程到未来架构革命:解锁高并发时代的底层思维范式
python·ai编程
十五_在努力22 分钟前
参透JavaScript —— 判断数据类型的四种方式
前端·javascript
依辰28 分钟前
小程序自动化构建与版本管理方案优化
前端·javascript·微信小程序