我曾试图理解某个类的singleton decorator实现是如何工作的,但我只是搞糊涂了。在
代码如下:
def singleton(cls):
instance = None
@functools.wraps(cls)
def inner(*args, **kwargs):
nonlocal instance
if instance is None:
instance = cls(*args, **kwargs)
return instance
return inner
@deco
是cls = deco(cls)
的合成糖,所以在这段代码中,当我们定义我们的cls
类并用这个singleton
修饰符包装时,cls
将不再是一个类,而是一个函数。Python会动态搜索变量链接到的对象,所以稍后我们尝试创建类的一个实例,这一行代码运行instance = cls(*args, **kwargs)
,难道我们不进入无限递归吗?cls
目前不是一个类,它是一个函数,因此它应该调用自己,进入递归。在
但效果很好。将创建一个单音,并且不会发生递归。它是如何工作的?在
cls
是对传递给装饰器的原始类的引用。它保留了调用decorator时的值。它的值在decorator返回的函数中被“捕获”;由于一些模糊的原因,这被称为闭包。函数是一级对象的大多数语言都具有这种能力。在您将获得:
^{pr2}$函数
inner
在局部变量cls
上闭合。在cls
是对类的引用。它永远不会反弹到其他任何东西。在decorator返回一个返回实例的函数,但这不影响内部
cls
变量引用的内容相关问题 更多 >
编程相关推荐