当前位置: 移动技术网 > IT编程>脚本编程>Python > Python中使用__new__实现单例模式并解析

Python中使用__new__实现单例模式并解析

2019年06月25日  | 移动技术网IT编程  | 我要评论

夜色美女,平凡文学网,在线生辰八字算命

阅读文章前请先阅读 python中类方法、__new__方法和__init__方法解析

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

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

这就是单例模式的实现。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网