裝飾器對與Python新手以致於熟悉Python的人都是一個難理解, 難寫的東西. 那麼今天就分享一下我對Python 裝飾器的理解linux
所謂裝飾器僅僅是一種語法糖, 可做用的對象能夠是函數也能夠是類, 裝飾器自己是一個函數, 其主要工做方式就是將被裝飾的類或者函數看成參數傳遞給裝飾器函數, 好比定義以下裝飾器shell
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
函數app
@run_timedef test(): print "just a test"
前面說過其實裝飾器就是一個語法糖, 就是將被裝飾的函數做爲參數傳遞給裝飾器函數, 因此上面能夠展開爲ide
test = run_time(test)
裝飾器將在解釋器運行一開始就被加載, 從而將被裝飾的函數將被展開成如上方式, 由於 run_time
裝飾器返回wrapper
函數, 因此當調用test
函數時其實就是對wrapper
的調用函數
若是你在Python shell下執行以上語句就會發現定義完test
函數而後查看test
時, shell所展現的是wrapper函數: url
接下來講說如何編寫帶參數的裝飾器, 你們若是細心的話就能夠發現其實帶參數的裝飾器是通過調用"裝飾器"函數返回的一個裝飾器, 之因此裝飾器上打引號是說明其實這個所謂的"裝飾器"只不過是一個普通的函數, 但這個普通的函數返回一個裝飾器, 能夠參看下面例子:spa
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
函數來收集參數.code
以上就是所有內容, 但願對裝飾器只知其一;不知其二的人有些許幫助orm