总结:
- 函数装饰器在被装饰的函数定义之后立即运行。
- 被装饰的函数只在明确调用时运行。
- 装饰器返回的应该是函数调用func而不是函数的运行结果func(),这也就是函数加不加括号的区别。
先看一下装饰器函数什么时候被执行。
例子一:
函数装饰器在被装饰的函数定义之后立即运行,所以尽管没有调用target(),但是装饰器函数还是有输出。
同时要注意deco返回的是被调函数的函数名——func,并没有调用这个func()函数。
def deco(func):
print('running inner()')
return func
@deco
def target():
print("running target()")
# target() #注意:并没有调用target()
输出:
running inner()
例子二:如果装饰器函数调用了被装饰的函数,那么被装饰的函数会被执行。
注意:被装饰的函数target在return func()这里被调用。func后面有括号。
def deco(func):
print('running inner()')
return func()
@deco
def target():
print("running target()")
# target() #注意:并没有调用target()
输出:
running inner()
running target()
例子三:当调用被装饰的函数时(target()没有被注释掉),此时运行函数其实就是运行装饰器。从代码中可以看出,装饰器函