装饰器如何使用python中的类

2024-05-15 21:38:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我曾试图理解某个类的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

@decocls = deco(cls)的合成糖,所以在这段代码中,当我们定义我们的cls类并用这个singleton修饰符包装时,cls将不再是一个类,而是一个函数。Python会动态搜索变量链接到的对象,所以稍后我们尝试创建类的一个实例,这一行代码运行instance = cls(*args, **kwargs),难道我们不进入无限递归吗?cls目前不是一个类,它是一个函数,因此它应该调用自己,进入递归。在

但效果很好。将创建一个单音,并且不会发生递归。它是如何工作的?在


Tags: instance函数代码nonereturndefargsdecorator
3条回答

cls是对传递给装饰器的原始类的引用。它保留了调用decorator时的值。它的值在decorator返回的函数中被“捕获”;由于一些模糊的原因,这被称为闭包。函数是一级对象的大多数语言都具有这种能力。在

def singleton(cls):
    instance = None

    @functools.wraps(cls)
    def inner(*args, **kwargs):
        nonlocal instance
        if instance is None:
            instance = cls(*args, **kwargs)
            print cls
        return instance
    return inner

@singleton
class TryMe(object):
   pass

m = TryMe()
print m

您将获得:

^{pr2}$

函数inner在局部变量cls上闭合。在

cls是对类的引用。它永远不会反弹到其他任何东西。在

decorator返回一个返回实例的函数,但这不影响内部cls变量引用的内容

相关问题 更多 >