【发布时间】:2020-06-09 15:37:12
【问题描述】:
当我学习如何在 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 吗?
由于我知道这个语法有效,所以我一直按原样使用它,但这让我觉得我还没有完全理解局部变量。
【问题讨论】:
-
instances在singleton内部是局部的,但是在getinstance的闭包 中,所以还是有对函数的引用。 -
@jonrsharpe 所以仍然有对 {instances} 的引用,因为 {singleton} 仍然是“开放的”?
标签: python syntax singleton decorator local-variables