python使用__new__来实现singleton单例模型

在软件设计过程中,根据需求需要实现singleton单例模型。比如创建数据库的连接实例。下面利用python新式类里的__new__的静态方法来实现。

__new__原型为object.__new__(cls,[...]),cls是一个类对象。当你调用C(*arg, **kargs)来创建一个类C的实例时。python内部调用是C.__new__(C, *arg, **kargs),然后返回值是类C的实例c。在确认c是C的实例后,python再调用C.__init__(c, *arg, **kargs)来实例化c。

所以调用一个实例c=C(2),实际执行的代码为:

c = C.__new__(C, 2)
if isinstance(c, C):
    C.__init__(c, 2)

object.__new__创建一个新的,没有经过初始化的实例。当你重写__new__方法时,可以不用使用修饰器@staticmethod指明它是静态函数。解释器会自动判断这个方法为静态方法。如果需要重新绑定C.__new__方法时,只要在类的外面执行C.__new__=staticmethod(youfunc)就可以了。

下面使用__new__来实现Singleton单例模型。

class Singleton(object):
    _singleton = {}
    
    def __new__(cls):
        if not cls._singleton.has_key(cls):
            cls._singleton[cls] = object.__new__(cls)
        return cls._singleton[cls]

python使用__new__来实现singleton单例模型

可以看出两个实例是指向同一个内存地址。Singleton所有子类也有这一个特性。只有一个实例对象。如果它的子类定义了__init__方法,那么必须保证它的__init__ 方法能够安全的同一个实例进行多次调用。

python使用__new__来实现singleton单例模型

你可能感兴趣的:(python使用__new__来实现singleton单例模型)