我试图了解某个类的某个单例装饰器实现是如何工作的,但我只是感到困惑。
这是代码:
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
目前还不是一个类,它是一个函数,因此应自行调用,以进行递归。
但这很好。将创建一个单调,并且不会发生递归。它是如何工作的?
该函数inner
在局部变量上关闭cls
。
cls
是对该类的引用。它永远不会反弹到其他任何东西。
装饰器返回一个函数,该函数返回一个实例,但这不会影响内部cls
变量所引用的内容
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句