gpt4 book ai didi

Python 装饰器 - 类中的 __call__

转载 作者:太空狗 更新时间:2023-10-29 18:28:00 24 4
gpt4 key购买 nike

我试图理解 Python 装饰器,并且我试图编写一个与此等效的程序:

class myDecorator(object):
def __init__(self, f):
print ("inside myDecorator.__init__()")
f() # Prove that function definition has completed

def __call__(self):
print ("inside myDecorator.__call__()")

@myDecorator
def aFunction():
print ("inside aFunction()")

print ("Finished decorating aFunction()")

aFunction()

问题是我不明白类的 __call__ 方法最后是如何通过调用 aFunction() 来调用的。

aFunction() 是否被替换为 myDecorator.__call__(aFunction)。你能帮我么?没有装饰器的等效程序会怎样?

谢谢!

最佳答案

你的代码的输出是

inside myDecorator.__init__()
inside aFunction()
Finished decorating aFunction()
inside myDecorator.__call__()

首先,你知道这个@装饰器语法是什么意思吗?

@decorator
def function(a):
pass

只是另一种说法:

def function(a):
pass
function = decorator(function)

所以,在你的情况下

@myDecorator
def aFunction():
print ("inside aFunction()")

意味着只是

def aFunction():
print ("inside aFunction()")
aFunction = myDecorator(aFunction)

首先,您基本上是创建 myDecorator 类的一个新实例,调用它的构造函数 (__init__) 并向它传递一个 aFunction 函数对象。然后,它执行 print 和 given 函数。另外,请注意,这是在解释器加载函数时发生的,而不是在执行时发生的,因此如果您从该文件中导入某些内容,它将然后执行,而不是在使用或调用时执行。

然后,执行aFunction(),当aFunction还在引用myDecorator实例时,让它调用myDecorator的__call__方法,执行。请注意,在这种情况下,f()f.__call__(f) 的含义相同,因为 __call__ 方法用于启用和覆盖默认对象的调用行为(简单来说,任何对象在定义了 __call__ 方法时都是可调用的)。

如果你想在一个函数被调用时执行它,那么你应该在 __init__ 中将它赋值给实例变量,并在 myDecorator 的 __call__ 中调用它。

关于Python 装饰器 - 类中的 __call__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19497771/

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