吾八哥博客

您现在的位置是:首页 > 码农手记 > Python > 正文

Python

Python里使用__new__实现单例模式

吾八哥2017-12-15Python2891

单例模式(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