# 使用装饰器实现单列模式 def singleton(cls): # 用来存在实例的字典 singleton_instance = {} def wrapper(*args, **kwargs): # 判断字典中是否实例 if not singleton_instance.get(cls.__name__): # 没有则创建一个实例,并存入字典中 singleton_instance[cls.__name__] = cls(*args, **kwargs) # 返回已经创建的实例 return singleton_instance[cls.__name__] return wrapper @singleton class A(object): def __init__(self): print("__init__") def test(self): print("test") print(A) print(id(A())) print(id(A())) A().test() 输出 <function singleton.<locals>.wrapper at 0x000002203FE44D08> __init__ 2337533963008 2337533963008 test
总结:
1、定义一个装饰器,在装饰器内部返回一个该类的对象皆可(如果已经有了,则返回之前创建的,所有需要一个字典来存储)
2、类被装饰器装饰以后,其类型已经被更改为 function 类型了
说明:cls.__name__ 可以任意命名,保持一致即可