先看一个一般的通用装饰器:
def user(func):
def wrapper(*args,**kwargs):
return func(*args,**kwargs)
return wrapper
@user
def A():
print("A")
@user
def B():
print("B")
if __name__ == '__main__':
#打印函数的名字
print(A.__name__)
print(B.__name__)
控制台打印函数名
上述例子可以看到使用同一个装饰器对不同的函数进行装饰,返回的函数名却是一样的。装饰器一般在Flask框架中应用较多,对视图函数进行装饰,定义路由信息,但是在Flask中视图函数是不允许重复的。
解决方案:导入一个包functools,对内层函数加上一个装饰器@functools.wraps()
因此一个完整的通用装饰器如下:
import functools
def user(func):
@functools.wraps(func)
def wrapper(*args,**kwargs):
return func(*args,**kwargs)
return wrapper
@user
def A():
print("A")
@user
def B():
print("B")
if __name__ == '__main__':
print(A.__name__)
print(B.__name__)
控制台再次打印函数名: