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

  

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

  

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

  

  

代码如下:
  

        MyClass类:   _instance=没有   _first_init=False   def __new__ (cls * args, * * kwargs):   如果不是cls._instance:   cls。_instance=super () . __new__ (cls)   返回cls._instance   def __init__(自我、var1 var2):   cls=类型(自我)   如果不是cls._first_init:   自我。var1=var1   自我。var2=var2   cls。_first_init=True      

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

  

在__new__方法中(构造函数),判断是否存在_instance这个类变量,如果之前已经实例化了,直接返回。如果是第一次实例化,就会为_instance类变量绑定实例,使用super () . __new__ (cls)创建实例,即调用父类object.__new__ (MyClass)创建实例。

  

在__init__方法中(初始化函数),我们通过cls=类型(自我)获取MyClass类,判断是否第一次实例化。如果是第一次实例化,就绑定实例变量。否则什么都不做。

  

<>强运行效果

  

我们创建两个实例,来对比

        在在在instance1=MyClass (1、2)   在在在5)instance2=MyClass(7日   在在在id (instance1)==id (instance2)   真正的      在在在instance2.var1   1      

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

  

这就是单例模式的实现。
  

  

  

在编程语言中创建一个类,有构造方法这样的一个术语。而在Python中,通常大家都认为__init__是构造方法,其实并不完全等同。在构建类中,有一个特殊的方法__new__,这个才能等同为构造方法。

  

__new__是一个类方法,我们在定义一个类方法时需要在函数前打上@classmethod装饰器,而__new__不需要,因为它经过特殊处理。为了理解__new__方法,我们先来看看类方法是什么。

  


  

        MyClass类:      @classmethod   def测试(cls):   打印(cls.__name__)      MyClass.test ()   #输出MyClass      

在MyClass类中,测试方法就是类方法,它传入第一个参数为cls,其实就是MyClass类,打印cls。__name__可以看到结果。类方法可以直接类名。方法名()调用。通常类方法是备选构造方法。

  


  

        在在在从datetime进口datetime   在在在datetime.fromtimestamp (324234)   datetime。datetime (1970、1、5、2、3, 54)      

如上所示,内置的datetime包中的fromtimestamp就是类方法,可以从多种方式构造出datetime对象。

  


  

        def __new__ (cls):   返回super () . __new__ (cls)      

__new__是类方法,所以第一个参数也是cls,剩下的参数就是构造方法里需要的参数了。通常__new__都不需要定义,在元类编程中才需要,它可以控制类的生成过程。
  

  

__new__必须返回一个实例(实例),传入到__init__方法中自我的参数,也就是实例变量。这里返回父类(对象)的__new__方法用来创建一个新的实例。相当于
  

        obj=object.__new__ (MyClass)   obj=MyClass ()      

# obj是实例,上面两个方式等同

  

其中,MyClass是类,obj是实例(实例)

  

  

__new__是构造方法,那么__init__就是初始化函数,它负责将变量绑定到实例中,更新实例的__dict__字典。其中第一个参数自我就是__new__的返回值,是类的实例. __new__方法先于__init__方法执行
  

        def __init__(自我):   自我。一个=      

结合使用
  

        MyClass类:   def __new__ (cls):   返回super () . __new__ (cls)      def __init__(自我):   自我。一个=obj=MyClass (3)   打印(obj.a)      

  

1。__new__是构造方法,__init__是初始化函数。

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