Python装饰器 - 类中的__call__

pin*_*ker 10 python python-decorators

我试图理解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()
Run Code Online (Sandbox Code Playgroud)

问题是我不了解如何__call__通过aFunction()最后调用来调用类的方法.

正在aFunction()被取代myDecorator.__call__(aFunction).你能帮我么?没有装饰器的等效程序怎么样?

谢谢!

小智 9

代码的输出是

inside myDecorator.__init__()
inside aFunction()
Finished decorating aFunction()
inside myDecorator.__call__()
Run Code Online (Sandbox Code Playgroud)

首先,你知道吗,@ decorator语法是什么意思?

@decorator
def function(a):
    pass
Run Code Online (Sandbox Code Playgroud)

只是另一种说法:

def function(a):
    pass
function = decorator(function)
Run Code Online (Sandbox Code Playgroud)

所以,在你的情况下

@myDecorator
def aFunction():
   print ("inside aFunction()")
Run Code Online (Sandbox Code Playgroud)

意思就是

def aFunction():
    print ("inside aFunction()")
aFunction = myDecorator(aFunction)
Run Code Online (Sandbox Code Playgroud)

首先,您基本上创建了一个myDecorator类的新实例,调用它的构造函数(__init__)并向其传递一个aFunction函数对象.然后,它执行打印和给定的功能.另外,请注意,这是在解释器加载函数时发生的,而不是在执行时加载,所以如果你从这个文件导入一些东西,那么它将被执行,而不是在使用或调用时.

然后,aFunction()当aFunction仍在引用myDecorator实例时,执行,使其调用__call__myDecorator 的方法,该方法执行.注意,这f()意味着与f.__call__(f)在这种情况下相同,因为__call__方法用于启用和覆盖默认对象的调用行为(简化中,任何对象在__call__定义方法时都是可调用的).

如果要在调用时执行aFunction,则应将其分配给实例变量__init__并在__call__myDecorator中调用它.