python new()实现单例模式原理 - ZhouXuyan/notes GitHub Wiki

单例模式是指:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

使用__new__方法实现单例:

  class Singleton(object)
      def __new__(cls, *args, **kw):
          if not hasattr(cls, '_instance'):
              orig = super(Singleton, cls)
              cls._instance = orig.__new__(cls, *args, **kw)
          return cls._instance

new()需要至少一个类参数cls,由python解释器自动填充,返回一个cls类的实例。 new()后调用的就是init()函数,new()的返回值就是init()的self。

在上面的代码中,实例化一个Singleton对象的时候,先调用new()函数,判断其中没有_instance参数, 则调用父类的new()方法生成一个父类对象,赋值给_instance,并将其返回。 此时Singleton类中增加了一个_instance属性,以后每次实例化Singleton对象,实例化的都是该_instance。 通过在第一次实例化Singleton对象前后分别调用:

  dir(Singleton)

可以清楚看到类属性发生变化,增加了_instance属性,以后每次实例化返回的其实都是同一个对象。