Python 装饰器在 load/import 上执行

Python Decorator executed on load/import

我正在努力思考 python 的装饰器。但是有些事情我不明白。这是我的代码,我的问题与 func_decorate2(带参数的装饰器)有关。

def func_decorate(f):
  def wrapper():
    print('wrapped');
    f() 
  return wrapper

@func_decorate
def myfunc1():
  print('func1')

def func_decorate2(tag_name):
  def _(f):
    print('underscore')
    return f
  return _

@func_decorate2('p')
def myfunc2():
  print('func2')

print('call func1')
myfunc1()
print('call func2')
myfunc2()

将输出:

underscore
call func1
wrapped
func1
call func2
func2

为什么我在这个例子中第一个是 underscore

谢谢

因为 func_decorate2('p') 立即执行并且 returns 一个装饰器,当解释器使用它装饰 myfunc2.

时,装饰器本身会立即执行

需要注意的是 @ 后面的部分只是一个表达式。它本身不必是一个函数——它只需要求值为 1,并且求值会在定义时立即发生。

因为func_decorate2错了。如果你想在你的装饰器中使用参数,你必须再添加一个 def level

def func_decorate2(tag_name):
  def _(f):
    def _fun():
        print('underscore')
        return f
    return _fun
  return _