Python实现单例模式

时间:2019-02-11
本文章向大家介绍Python实现单例模式,主要包括Python实现单例模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

单例模式:就是一个类只能实例化一次,只能拥有一个实例。

python中类的实例的创建由 new 完成, 实例的初始化由 init 完成。
因此单例模式可以通过在new这边进行拦截来实现。

class A:
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls,'_instance'):
            setattr(cls,'_instance',super().__new__(cls))
        return getattr(cls,'_instance')

hasattr用于查看是否已存在实例(ps:类的属性都是存放在字典里’cls._dict’),不存在的话就创建(使用setattr),存在就直接返回,完成单例模式。如果想要实例的属性不被改变,还可以在init 中setattr一个_flag,假如要设置新属性的时候检查flag。

以上是用new来实现,也可以采用装饰器的方式来实现:

from functools import wraps
def singleton(cls):
    instance = None
    @wraps(cls)
    def wrapper(*args,**kwargs):
        nonlocal instance
        if instance is None:
            instance = cls(*args,**kwargs)
        return instance
    return wrapper

@singleton
class A:
    def __init__(self,val):
        self.val = val
        print(self.val)

a = A(5)
print('a')
b = A(2)
print('b')

装饰器写起来更加简洁,代码修改维护也方便,推荐使用