Python裝飾器(decorator)在實現(xiàn)的時候,被裝飾后的函數(shù)其實已經(jīng)是另外一個函數(shù)了(函數(shù)名等函數(shù)屬性會發(fā)生改變),
為了不影響,Python的functools包中提供了一個叫wraps的decorator來消除這樣的副作用。寫一個decorator的時候,最好在實現(xiàn)之前加上functools的wrap,
它能保留原有函數(shù)的名稱和docstring。
未加@wraps的時候:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
from functools import wraps def wrapper(func): # @wraps(func) def inner( * args, * * kwargs): print ( "裝飾器工作中..." ) func( * args, * * kwargs) return inner @wrapper def f1(arg): """ 這是一個測試裝飾器修復技術的函數(shù) :param arg: 隨便傳 :return: 沒有 """ print (arg) f1( '呵呵' ) print (f1.__name__,f1.__doc__) |
打印結果是:
但是加上@wraps以后:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
from functools import wraps def wrapper(func): @wraps (func) def inner( * args, * * kwargs): print ( "裝飾器工作中..." ) func( * args, * * kwargs) return inner @wrapper def f1(arg): """ 這是一個測試裝飾器修復技術的函數(shù) :param arg: 隨便傳 :return: 沒有 """ print (arg) f1( '呵呵' ) print (f1.__name__,f1.__doc__) |
打印結果是:
其中主要的就是兩個變量:
1、顯示 正在執(zhí)行的函數(shù)的名稱 f.name
2、顯示 正在執(zhí)行的函數(shù)的注釋 f.doc
簡單來說就是:
如果沒使用@wraps,當A調用了裝飾器B的話,即使A.name,返回的會是裝飾器B的函數(shù)名稱,而不是A的函數(shù)名稱
如果使用了@wraps,當A調用了裝飾器B的話,A.__ name__返回的會是A函數(shù)的名稱,而不是飾器B的名稱,
這也即使常說的@wraps是裝飾器的修復技術,
實際就是修復還原了A的__ name__變量,同理__ doc__變量也是一樣。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://www.cnblogs.com/djdjdj123/p/12181230.html