这是Python装饰器的语法,使用@符号,表示将装饰器函数放在被装饰函数的上方。当调用被装饰函数时,实际上是调用了装饰器函数,装饰器函数可以在调用被装饰函数之前或之后执行一些额外的操作。
#funA 作为装饰器函数
def funA(fn):
#...
fn() # 执行传入的fn参数
#...
return '...'
@funA
def funB():
实际上,上面程序完全等价于下面的程序:
def funA(fn):
#...
fn() # 执行传入的fn参数
#...
return '...'
def funB():
#...
funB = funA(funB)
定义一个装饰器
def decorator_function(original_function):
def wrapper_function():
print("装饰器函数执行前的操作")
original_function()
print("装饰器函数执行后的操作")
return wrapper_function
@decorator_function
def hello():
print("Hello, World!")
hello()
如果去掉被装饰函数的调用
def decorator_function(original_function):
def wrapper_function():
print("装饰器函数执行前的操作")
# original_function()
print("装饰器函数执行后的操作")
return wrapper_function
@decorator_function
def hello():
print("Hello, World!")
hello()
是不是很奇怪为什么没打印hello, world!
因为它等于以下代码
def decorator_function(original_function):
def wrapper_function():
print("装饰器函数执行前的操作")
# original_function()
print("装饰器函数执行后的操作")
return wrapper_function
def hello():
print("Hello, World!")
hello = decorator_function(hello)
hello()
参考:
Python中的“ @”(@)符号有什么作用?_p15097962069的博客-CSDN博客
https://www.cnblogs.com/satire/p/15112770.html