Python里使用__new__实现单例模式
单例模式(Singleton Pattern)在软件开发过程中是一种非常常用的设计模式,该模式的目的是确保某一个类只有一个实例存在。需要单实例运行的场景下就可以采用单例模式,而且单例模式在很多公司的面试过程中也会被问到的哦!
Python里实现单例的方式有很多种,例如:使用模块、使用 __new__、使用装饰器(decorator)、使用元类(metaclass)。今天这里只给大家分享下使用__new__的方式来实现单例模式。具体看代码:
class MySingleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_myinst'): cls._myinst = super(MySingleton, cls).__new__(cls) return cls._myinst class MyTestObj(MySingleton): def __init__(self, version): self.version = version if __name__ == '__main__': A = MyTestObj(1.0) B = MyTestObj(1.1) print(id(A), A.version) print(id(B), B.version)
以上代码里是在__new__方法里进行判断实例是否存在,如果不存在则创建,存在则直接返回存在的实例,来达到单例的目的。定义了一个子类来做测试,传入参数version,然后定义两个变量A和B,分别进行初始化赋值,再打印version变量值和A、B的地址,运行效果如下:
1793969741776 1.1 1793969741776 1.1
由此可见,虽然定义了不同的变量A、B传入不同的参数,实际上操作的是同一个实例对象,而且内存地址也是一样的。
注意下哦,以上代码是在Python3环境下的,如果是在Python2下,需要将第四行
cls._myinst = super(MySingleton, cls).__new__(cls)
改为:
cls._myinst = super(MySingleton, cls).__new__(cls, *args, **kwargs)
首发:学Python网 http://www.xuepython.wang/post/36.html