簡單說明Python中的裝飾器的用法
裝飾器對與Python新手以至于熟悉Python的人都是一個難理解, 難寫的東西. 那么今天就分享一下我對Python 裝飾器的理解
所謂裝飾器僅僅是一種語法糖, 可作用的對象可以是函數(shù)也可以是類, 裝飾器本身是一個函數(shù), 其主要工作方式就是將被裝飾的類或者函數(shù)當作參數(shù)傳遞給裝飾器函數(shù), 比如定義如下裝飾器
import time def run_time(func): def wrapper(*args, **kwargs): start = time.time() r = func(*args, **kwargs) print time.time() - start return r return wrapper
我們用這個裝飾器裝飾一個test函數(shù)
@run_time def test(): print "just a test"
前面說過其實裝飾器就是一個語法糖, 就是將被裝飾的函數(shù)作為參數(shù)傳遞給裝飾器函數(shù), 所以上面可以展開為
test = run_time(test)
裝飾器將在解釋器運行一開始就被加載, 從而將被裝飾的函數(shù)將被展開成如上方式, 因為 run_time裝飾器返回wrapper函數(shù), 所以當調(diào)用test函數(shù)時其實就是對wrapper的調(diào)用
如果你在Python shell下執(zhí)行以上語句就會發(fā)現(xiàn)定義完test函數(shù)然后查看test時, shell所展示的是wrapper函數(shù)
接下來說說如何編寫帶參數(shù)的裝飾器, 大家如果細心的話就可以發(fā)現(xiàn)其實帶參數(shù)的裝飾器是經(jīng)過調(diào)用"裝飾器"函數(shù)返回的一個裝飾器, 之所以裝飾器上打引號是說明其實這個所謂的"裝飾器"只不過是一個普通的函數(shù), 但這個普通的函數(shù)返回一個裝飾器, 可以參看下面例子:
import time def route(url): def decorator(func): func.__url__ = url return func return decorator @route(r"/") def index(): return "Hi"
大家可以發(fā)現(xiàn)在使用route裝飾器時我們其實是調(diào)用了route函數(shù), route函數(shù)返回一個decorator裝飾器, 因為我們不需要在裝飾器內(nèi)運行函數(shù), 所以不需要一個wrapper函數(shù)來收集參數(shù).
以上就是全部內(nèi)容, 希望對裝飾器一知半解的人有些許幫助
相關文章
python 實現(xiàn)將txt文件多行合并為一行并將中間的空格去掉方法
今天小編就為大家分享一篇python 實現(xiàn)將txt文件多行合并為一行并將中間的空格去掉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python趣味挑戰(zhàn)之pygame實現(xiàn)無敵好看的百葉窗動態(tài)效果
最近寫了很多期關于pygame的案例和知識點,自己也收獲了很多知識,也在這個過程中成長了不少, 這次還是圍繞surface對象進行詳細介紹,并形成完整的案例過程,文中有非常詳細實現(xiàn)百葉窗動態(tài)效果的代碼示例,需要的朋友可以參考下2021-05-05python神經(jīng)網(wǎng)絡tfrecords文件的寫入讀取及內(nèi)容解析
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡tfrecords文件的寫入讀取及內(nèi)容解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05在SQLite-Python中實現(xiàn)返回、查詢中文字段的方法
今天小編就為大家分享一篇在SQLite-Python中實現(xiàn)返回、查詢中文字段的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07