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

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

这就是单例模式的实现。

相关推荐

  1. 如何使用Python实现模式

    2024-01-03 10:56:04       16 阅读
  2. 【面试】在Python如何实现模式

    2024-01-03 10:56:04       28 阅读
  3. Python如何实现模式?

    2024-01-03 10:56:04       31 阅读
  4. PythonPython 实现模式

    2024-01-03 10:56:04       35 阅读
  5. Python 实现模式

    2024-01-03 10:56:04       46 阅读
  6. 模式如何实现

    2024-01-03 10:56:04       11 阅读
  7. Python实现模式

    2024-01-03 10:56:04       13 阅读
  8. 如何在PHP实现设计模式

    2024-01-03 10:56:04       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-03 10:56:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-03 10:56:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-03 10:56:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-03 10:56:04       20 阅读

热门阅读

  1. HBASE基础

    2024-01-03 10:56:04       41 阅读
  2. css视觉格式化模型

    2024-01-03 10:56:04       40 阅读
  3. 对html骨架的详细解释

    2024-01-03 10:56:04       37 阅读
  4. 【WPF.NET开发】如何创建自定义路由事件

    2024-01-03 10:56:04       44 阅读
  5. 微信养号指南:提高账号权重

    2024-01-03 10:56:04       39 阅读
  6. LDD学习笔记 -- 用户空间 & 内核空间

    2024-01-03 10:56:04       46 阅读
  7. 微信小程序 wx.request二次封装

    2024-01-03 10:56:04       39 阅读
  8. 卸载云服务器上的 MySQL 数据库

    2024-01-03 10:56:04       37 阅读
  9. C++ 拷贝构造函数

    2024-01-03 10:56:04       41 阅读
  10. User mkcert 生成本地证书的步骤

    2024-01-03 10:56:04       42 阅读