使用装饰器创建单例类

单例是一种模式,它将类的实例化限制为一个实例/对象。使用装饰器,我们可以通过强制类返回类的现有实例或创建新实例(如果它不存在)来将类定义为单例。

def singleton(cls):    
    instance = [None]
    def wrapper(*args, **kwargs):
        if instance[0] is None:
            instance[0] = cls(*args, **kwargs)
        return instance[0]

    return wrapper

可以将此装饰器添加到任何类声明中,并确保最多创建一个类的一个实例。任何后续调用都将返回已存在的类实例。

@singleton
class SomeSingletonClass:
    x = 2
    def __init__(self):
        print("Created!")

instance = SomeSingletonClass()  # prints: Created!
instance = SomeSingletonClass()  # doesn't print anything
print(instance.x)                # 2

instance.x = 3
print(SomeSingletonClass().x)    # 3

因此,无论你是通过本地变量引用类实例还是创建另一个实例,都始终获得相同的对象。