裝飾器對與Python新手以至于熟悉Python的人都是一個難理解, 難寫的東西. 那么今天就分享一下我對Python 裝飾器的理解
所謂裝飾器僅僅是一種語法糖, 可作用的對象可以是函數也可以是類, 裝飾器本身是一個函數, 其主要工作方式就是將被裝飾的類或者函數當作參數傳遞給裝飾器函數, 比如定義如下裝飾器
import timedef run_time(func): def wrapper(*args, **kwargs): start = time.time() r = func(*args, **kwargs) print time.time() - start return r return wrapper
我們用這個裝飾器裝飾一個test函數
@run_timedef test(): print "just a test"
前面說過其實裝飾器就是一個語法糖, 就是將被裝飾的函數作為參數傳遞給裝飾器函數, 所以上面可以展開為
test = run_time(test)
裝飾器將在解釋器運行一開始就被加載, 從而將被裝飾的函數將被展開成如上方式, 因為 run_time裝飾器返回wrapper函數, 所以當調用test函數時其實就是對wrapper的調用
如果你在Python shell下執行以上語句就會發現定義完test函數然后查看test時, shell所展示的是wrapper函數

接下來說說如何編寫帶參數的裝飾器, 大家如果細心的話就可以發現其實帶參數的裝飾器是經過調用"裝飾器"函數返回的一個裝飾器, 之所以裝飾器上打引號是說明其實這個所謂的"裝飾器"只不過是一個普通的函數, 但這個普通的函數返回一個裝飾器, 可以參看下面例子:
import timedef route(url): def decorator(func): func.__url__ = url return func return decorator@route(r"/")def index(): return "Hi"
大家可以發現在使用route裝飾器時我們其實是調用了route函數, route函數返回一個decorator裝飾器, 因為我們不需要在裝飾器內運行函數, 所以不需要一個wrapper函數來收集參數.
以上就是全部內容, 希望對裝飾器一知半解的人有些許幫助
新聞熱點
疑難解答
圖片精選