当我们理解了Python的__new__方法后,我们还可以利用它来做一些其他有趣的事情,比如实现设计模式中的单例模式(singleton) 。
因为类每一次实例化后产生的过程都是通过__new__来控制的,所以通过重载__new__方法,我们可以很简单的实现单例模式。
先看在python3中怎么实现单例模式:
代码如下 | 复制代码 |
class Singleton(object): def __new__(cls): if not hasattr(cls, 'instance'): cls.instance = super(Singleton, cls).__new__(cls) return cls.instance if __name__ == '__main__': a = Singleton() b = Singleton() print(id(a)) print(id(b)) |
输出的id相同,这里被实例化出来的a和b都指向同一个对象,说明在内存中只存在一个实例化的对象,通过重写new方法,这样的单例模式实现起来简单。
下面看四种单例模式
代码如下 | 复制代码 |
#-*- encoding=utf-8 -*- print '----------------------方法1--------------------------' #方法1,实现__new__方法 #并在将一个类的实例绑定到类变量_instance上, #如果cls._instance为None说明该类还没有实例化过,实例化该类,并返回 #如果cls._instance不为None,直接返回cls._instance 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 class MyClass(Singleton): one = MyClass() two.a = 3 print '----------------------方法2--------------------------' class MyClass2(Borg): one = MyClass2() #one和two是两个不同的对象,id, ==, is对比结果可看出 print '----------------------方法3--------------------------' class MyClass3(object): one = MyClass3() two.a = 3 print '----------------------方法4--------------------------' @singleton one = MyClass4() two.a = 3 |