Python的裝飾器用法學(xué)習(xí)筆記
在python中常看到在定義函數(shù)是使用@func. 這就是裝飾器, 裝飾器是把一個函數(shù)作為參數(shù)的函數(shù),常常用于擴展已有函數(shù),即不改變當前函數(shù)狀態(tài)下增加功能.
def run(): print "I'm run."
我有這么一個函數(shù), 我想知道這個函數(shù)什么時候開始什么時候結(jié)束. 我應(yīng)該這么寫
def run(): print time.ctime() print "I'm run." print time.ctime()
但是如果不允許修改函數(shù)的話就需要裝飾器了
def count(func): def wrapper(): print time.ctime() ret = func() print time.ctime() return ret return wrapper @count def run(): print "I'm run." # print '2015-4-10'
eg:
def now(): print '2015-4-10' f = now f()
函數(shù)有一個__name__ 對象 可通過 dir(func) func為定義的函數(shù)名
now.__name__ # print 'now' f.__name__ # print 'now' print f # print '<function now at 0x000000000213A908>' print now # print '<function now at 0x000000000213A908>'
我們通過裝飾器打印log日志
def log(func): def wrapper(*args, **kwargs): print "call %s()" % func.__name__ return func(*args, **kwargs) return wrapper @log def now(): print '2015-4-10' now() # print 'call now()'
其實裝飾器修飾函數(shù)相當于, now = log(now) 也就是裝飾器函數(shù)把被修飾的函數(shù)當參數(shù)后賦給同名的變量
functools.wraps 函數(shù)
當我們使用了裝飾器后now的__name__值發(fā)生了改變
# 沒有使用前 now.__name__ # print 'now' # 使用后 now.__name__ # print 'wrapper'
當我們使用裝飾器前,now.__name__使用的是當前now函數(shù),但使用后 now這個函數(shù)其實是 log(now) 也就是log函數(shù)的返回值也就是被包裹的wrapper. 解決方法是functools.wraps函數(shù).
裝飾閉包, 使用前得調(diào)用 import functools
def log(func): @functools.wraps(func) def wrapper(*args, **kwargs): ...
帶參數(shù)的裝飾器
如果decorator需要傳入?yún)?shù), 那就需要在寫一個返回decorator的高階函數(shù). 寫出來更復(fù)雜.
def login(level): def _deco(func): def wrapper(*args, **kwargs): if level >= 5: print '用戶 VIP 等級 %d' % int(level-5) else: print '用戶 屌絲 等級 %d' % abs(level-5) return func(*args, **kwargs) return wrapper return _deco @login(5) def user(username): print 'welcome, %s' % username # 用戶vip 等級0 # welcome, mink user('mink')
帶參數(shù)的decorator等于func = 裝飾器函數(shù)(裝飾器參數(shù))(func)
裝飾器類
通過類的__call__可以想使用函數(shù)一樣使用類
class A(object): def __init__(self, func): self.func = func def __call__(self): return self.func() ** 2 @A def foo(): return 10 print foo() # print 100
- Python學(xué)習(xí)筆記之if語句的使用示例
- Python3學(xué)習(xí)筆記之列表方法示例詳解
- python筆記:mysql、redis操作方法
- 詳解Python pygame安裝過程筆記
- Python學(xué)習(xí)筆記之解析json的方法分析
- Python中shutil模塊的學(xué)習(xí)筆記教程
- python中import學(xué)習(xí)備忘筆記
- Python 爬蟲學(xué)習(xí)筆記之多線程爬蟲
- Python 爬蟲學(xué)習(xí)筆記之單線程爬蟲
- Python 爬蟲學(xué)習(xí)筆記之正則表達式
- Python兩個內(nèi)置函數(shù) locals 和globals(學(xué)習(xí)筆記)
- Python的面向?qū)ο缶幊谭绞綄W(xué)習(xí)筆記
- Python中的異常處理相關(guān)語句基礎(chǔ)學(xué)習(xí)筆記
- Python常用的內(nèi)置序列結(jié)構(gòu)(列表、元組、字典)學(xué)習(xí)筆記
- Python面向?qū)ο缶幊讨嘘P(guān)于類和方法的學(xué)習(xí)筆記
- python安裝mysql-python簡明筆記(ubuntu環(huán)境)
- Python的dict字典結(jié)構(gòu)操作方法學(xué)習(xí)筆記
- Python基礎(chǔ)語言學(xué)習(xí)筆記總結(jié)(精華)
相關(guān)文章
Jupyter Notebook切換conda虛擬環(huán)境的實現(xiàn)步驟
本文主要介紹了Jupyter Notebook切換conda虛擬環(huán)境的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07快速實現(xiàn)基于Python的微信聊天機器人示例代碼
本篇文章主要介紹了快速實現(xiàn)基于Python的微信聊天機器人示例代碼,基于itchat開發(fā),可以用它做一個微信聊天機器人,有興趣的可以了解一下。2017-03-03python3實現(xiàn)公眾號每日定時發(fā)送日報和圖片
這篇文章主要為大家詳細介紹了python3實現(xiàn)公眾號每日定時發(fā)送日報和圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02Python爬蟲通過替換http request header來欺騙瀏覽器實現(xiàn)登錄功能
這篇文章主要介紹了Python爬蟲通過替換http request header來欺騙瀏覽器實現(xiàn)登錄功能,需要的朋友可以參考下2018-01-01pandas預(yù)處理部分地區(qū)數(shù)據(jù)案例
本文主要介紹了pandas預(yù)處理部分地區(qū)數(shù)據(jù)案例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01