装饰器的作用: 在不改变原有功能代码的基础上,添加额外的功能。
@wraps(view_func)的作用: 防止改变使用装饰器后原有函数的结构(如name, doc等等)
1、未使用装饰器
def test(func):
def wrapper(*args, **kwargs):
'''我是打算用来当装饰器的函数2'''
print('args: ', args)
print('kwargs:', kwargs)
args = (11,22,33)
kwargs['name'] = 'Test_c'
return func(*args, **kwargs)
return wrapper
def func_test(*args, **kwargs):
'''我是演示函数1'''
print('我是测试函数')
print('---',args, kwargs)
func_test(1,2,3,a=123,b=456)
print('*'*20)
print(func_test.__name__)
print(func_test.__doc__)
print('*'*20)
输出结果为:
我是测试函数
--- (1, 2, 3) {'a': 123, 'b': 456}
********************
func_test
我是演示函数1
********************
2、用装饰器但是未用@wargs
def test(func):
def wrapper(*args, **kwargs):
'''我是打算用来当装饰器的函数2'''
print('args: ', args)
print('kwargs:', kwargs)
args = (11,22,33)
kwargs['name'] = 'Test_c'
return func(*args, **kwargs)
return wrapper
@test
def func_test(*args, **kwargs):
'''我是演示函数1'''
print('我是测试函数')
print('---',args, kwargs)
func_test(1,2,3,a=123,b=456)
print('*'*20)
print(func_test.__name__)
print(func_test.__doc__)
print('*'*20)
输出结果为:
args: (1, 2, 3)
kwargs: {'a': 123, 'b': 456}
我是测试函数
--- (11, 22, 33) {'a': 123, 'b': 456, 'name': 'Test_c'}
********************
wrapper
我是计划用来当做装饰器的函数2
********************
注意:很明显演示函数1的方法被改写了,这不是我们想要的结果
3、使用@wargs后
from functools import wraps
def test(func):
@wraps(func)
def wrapper(*args, **kwargs):
'''我是计划用来当做装饰器的函数2'''
print('args: ', args)
print('kwargs:', kwargs)
args = (11,22,33)
kwargs['name'] = 'Test_c'
return func(*args, **kwargs)
return wrapper
@test
def func_test(*args, **kwargs):
'''我是演示函数1'''
print('我是测试函数')
print('---',args, kwargs)
func_test(1,2,3,a=123,b=456)
print('*'*20)
print(func_test.__name__)
print(func_test.__doc__)
print('*'*20)
输出结果为:
args: (1, 2, 3)
kwargs: {'a': 123, 'b': 456}
我是测试函数
--- (11, 22, 33) {'a': 123, 'b': 456, 'name': 'Test_c'}
********************
func_test
我是演示函数1
********************
可见装饰器函数也执行了,同时演示函数1的方法也没有被改写。
网友评论