单例是一种将类的实例限制为一个实例/对象的模式。使用装饰器,我们可以通过强制该类返回该类的现有实例或创建一个新实例(如果不存在)来将其定义为单例。
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() # 打印:创建! instance = SomeSingletonClass() # 什么都不打印 print(instance.x) # 2 instance.x = 3 print(SomeSingletonClass().x) # 3
因此,无论是通过局部变量引用类实例还是创建另一个“实例”,都始终得到相同的对象。