裝飾器的作用: 在不改變原有功能代碼的基礎上,添加額外的功能贿讹。
@wraps(view_func)的作用: 防止改變使用裝飾器后原有函數(shù)的結構(如name, doc等等)
1渐逃、未使用裝飾器
def test(func):
def wrapper(*args, **kwargs):
'''我是打算用來當裝飾器的函數(shù)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):
'''我是演示函數(shù)1'''
print('我是測試函數(shù)')
print('---',args, kwargs)
func_test(1,2,3,a=123,b=456)
print('*'*20)
print(func_test.__name__)
print(func_test.__doc__)
print('*'*20)
輸出結果為:
我是測試函數(shù)
--- (1, 2, 3) {'a': 123, 'b': 456}
********************
func_test
我是演示函數(shù)1
********************
2、用裝飾器但是未用@wargs
def test(func):
def wrapper(*args, **kwargs):
'''我是打算用來當裝飾器的函數(shù)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):
'''我是演示函數(shù)1'''
print('我是測試函數(shù)')
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}
我是測試函數(shù)
--- (11, 22, 33) {'a': 123, 'b': 456, 'name': 'Test_c'}
********************
wrapper
我是計劃用來當做裝飾器的函數(shù)2
********************
注意:很明顯演示函數(shù)1的方法被改寫了民褂,這不是我們想要的結果
3茄菊、使用@wargs后
from functools import wraps
def test(func):
@wraps(func)
def wrapper(*args, **kwargs):
'''我是計劃用來當做裝飾器的函數(shù)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):
'''我是演示函數(shù)1'''
print('我是測試函數(shù)')
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}
我是測試函數(shù)
--- (11, 22, 33) {'a': 123, 'b': 456, 'name': 'Test_c'}
********************
func_test
我是演示函數(shù)1
********************
可見裝飾器函數(shù)也執(zhí)行了,同時演示函數(shù)1的方法也沒有被改寫赊堪。