gpt4 book ai didi

python - 有人可以向我解释这个装饰器代码吗?

转载 作者:太空狗 更新时间:2023-10-29 22:31:01 24 4
gpt4 key购买 nike

代码取自 Mark Lutz 的 Learning Python 4th Edition

class tracer:
def __init__(self, func):
self.calls = 0
self.func = func
def __call__(self, *args):
self.calls += 1
print('call %s to %s' % (self.calls, self.func.__name__))
self.func(*args)


@tracer

def spam(a, b, c):
print(a + b + c)

spam(1, 2, 3)

此外,当我运行这段代码时,它也不会打印 1、2、3 的总和,但在书中,它显示了!整个代码让我摸不着头脑。我不知道这里发生了什么。

最佳答案

这里发生的是函数体被替换。像这样的装饰器

@tracer
def spam(...)
...

相当于:

def spam(...)
...
spam = tracer(spam)

现在,tracer(spam) 返回 tracer 类的实例,其中 spam 的原始定义存储在 self 中.func

class tracer:
def __init__(self, func): #tracer(spam), func is assigned spam
self.calls = 0
self.func = func

现在当你调用 spam 时,(它实际上是 tracer 的一个实例)你调用了 中定义的 __call__ 方法示踪剂类:

def __call__(self, *args):
self.calls += 1
print('call %s to %s' % (self.calls, self.func.__name__))

所以本质上,这个__call__ 方法覆盖spam 中最初定义的正文。要执行正文,您需要调用存储在 tracer 类实例中的函数,如下所示:

def __call__(self, *args):
self.calls += 1
print('call %s to %s' % (self.calls, self.func.__name__))
self.func(*args)

导致

>>> 
call 1 to spam
6

关于python - 有人可以向我解释这个装饰器代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17847733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com