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

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

__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。python

因此调用一个实例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]

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

相关文章
相关标签/搜索