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

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

这就是单例模式的实现。

相关推荐
এ慕ོ冬℘゜3 分钟前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
_Jimmy_24 分钟前
AI应用开发工程师面试题库
人工智能·python·深度学习·机器学习·知识图谱
用户83562907805124 分钟前
Python 实现 Excel 命名范围(Named Range)的创建与管理
后端·python
dreamer_83991 小时前
AI智能合同比对系统:从零搭建实战教程
人工智能·python
sugar__salt1 小时前
Vue3 表单双向绑定与响应式核心 API 技术详解
前端·javascript·vue.js
SmartBoyW2 小时前
CSS弹性布局(Flexbox)学习笔记:从零开始搞懂弹性布局
前端·javascript
AOwhisky2 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发
用户938515635072 小时前
写了这么久 useState,你真的知道它在干什么吗?
前端·javascript
观察员2 小时前
带你用一个 Python 图书系统,通关封装继承多态
python
烬羽2 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法