[在学习如何在Python中创建单例时,我们大多数人首先遇到这种装饰器:
def singleton(class_):
instances = {}
def getinstance(*args, **kwargs):
if class_ not in instances:
instances[class_] = class_(*args, **kwargs)
return instances[class_]
return getinstance
@singleton
class MyClass(BaseClass):
pass
虽然此装饰器的工作方式非常直观,但令我感到奇怪的是,当我们在“ MyClass”中创建第二个对象时,该装饰器会检查是否已经创建了一个对象。
在“单例”的定义中,Python检查“实例”字典。但是,它是一个局部变量:函数运行后,它不应该被销毁吗?因此,if class_ not in instances
条件不应该始终为True吗?
因为我知道这种语法有效,所以我一直按原样使用它,但是这让我感到我仍然还没有完全理解局部变量。
getinstance
和instances
上,class_
是closure