https://www.cnblogs.com/wuyongqiang/p/10171273.html
https://blog.csdn.net/Refrain__WG/article/details/81013374
https://blog.csdn.net/hqzxsc2006/article/details/50337865
https://blog.csdn.net/xiangxianghehe/article/details/77170585
装饰器的作用: 在不改变原有功能代码的基础上,添加额外的功能,如用户验证等
@wraps(view_func)的作用: 不改变使用装饰器原有函数的结构(如__name__, __doc__)
不使用wraps可能出现的ERROR: view_func...endpoint...map...
例子1:
# -*- encoding:utf-8 -*-
from functools import wraps
def test(func):
def wrapper(*args,**kwargs):
'''我是说明1'''
print('args: ',args)
print('kwargs: ',kwargs)
args = (11,22,33)
kwargs['name'] = 'Test_C'
return func(*args,**kwargs)
return wrapper
@test
def fun_test(*args,**kwargs):
'''我是说明2'''
print('我是一个函数')
print('---',args,kwargs)
fun_test(1,2,3,4,a=123,b=456,c=789)
print('*'*20)
print(fun_test.__name__)
print(fun_test.__doc__)
结果:
args: (1, 2, 3, 4)
kwargs: {'a': 123, 'b': 456, 'c': 789}
我是一个函数
--- (11, 22, 33) {'a': 123, 'b': 456, 'c': 789, 'name': 'Test_C'}
********************
wrapper
我是说明1
例子2:
# -*- encoding:utf-8 -*-
from functools import wraps
def test(func):
@wraps(func)
def wrapper(*args,**kwargs):
'''我是说明1'''
print('args: ',args)
print('kwargs: ',kwargs)
args = (11,22,33)
kwargs['name'] = 'Test_C'
return func(*args,**kwargs)
return wrapper
@test
def fun_test(*args,**kwargs):
'''我是说明2'''
print('我是一个函数')
print('---',args,kwargs)
fun_test(1,2,3,4,a=123,b=456,c=789)
print('*'*20)
print(fun_test.__name__)
print(fun_test.__doc__)
结果:
args: (1, 2, 3, 4)
kwargs: {'a': 123, 'b': 456, 'c': 789}
我是一个函数
--- (11, 22, 33) {'a': 123, 'b': 456, 'c': 789, 'name': 'Test_C'}
********************
fun_test
我是说明2