Python的裝飾器用法學(xué)習(xí)筆記
在python中常看到在定義函數(shù)是使用@func. 這就是裝飾器, 裝飾器是把一個(gè)函數(shù)作為參數(shù)的函數(shù),常常用于擴(kuò)展已有函數(shù),即不改變當(dāng)前函數(shù)狀態(tài)下增加功能.
def run(): print "I'm run."
我有這么一個(gè)函數(shù), 我想知道這個(gè)函數(shù)什么時(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ù)有一個(gè)__name__ 對(duì)象 可通過 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í)裝飾器修飾函數(shù)相當(dāng)于, now = log(now) 也就是裝飾器函數(shù)把被修飾的函數(shù)當(dāng)參數(shù)后賦給同名的變量
functools.wraps 函數(shù)
當(dāng)我們使用了裝飾器后now的__name__值發(fā)生了改變
# 沒有使用前 now.__name__ # print 'now' # 使用后 now.__name__ # print 'wrapper'
當(dāng)我們使用裝飾器前,now.__name__使用的是當(dāng)前now函數(shù),但使用后 now這個(gè)函數(shù)其實(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ù), 那就需要在寫一個(gè)返回decorator的高階函數(shù). 寫出來更復(fù)雜.
def login(level):
def _deco(func):
def wrapper(*args, **kwargs):
if level >= 5:
print '用戶 VIP 等級(jí) %d' % int(level-5)
else:
print '用戶 屌絲 等級(jí) %d' % abs(level-5)
return func(*args, **kwargs)
return wrapper
return _deco
@login(5)
def user(username):
print 'welcome, %s' % username
# 用戶vip 等級(jí)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í)筆記之正則表達(dá)式
- Python兩個(gè)內(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)文章
一文詳解NumPy簡單算術(shù)及其他運(yùn)算的實(shí)現(xiàn)
你可以直接在 NumPy 數(shù)組之間使用算術(shù)運(yùn)算符 + - * /,但本節(jié)討論了一個(gè)擴(kuò)展,其中我們有函數(shù)可以接受任何類似數(shù)組的對(duì)象,如列表、元組等,并根據(jù)條件執(zhí)行算術(shù)運(yùn)算,文中通過代碼示例給大家講解的非常詳細(xì),需要的朋友可以參考下2024-06-06
Python+Selenium隨機(jī)生成手機(jī)驗(yàn)證碼并檢查頁面上是否彈出重復(fù)手機(jī)號(hào)碼提示框
這篇文章主要介紹了Python+Selenium隨機(jī)生成手機(jī)驗(yàn)證碼并檢查頁面上是否彈出重復(fù)手機(jī)號(hào)碼提示框,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Python實(shí)現(xiàn)獲取內(nèi)網(wǎng)IP地址的方法總結(jié)
這篇文章主要為大家詳細(xì)介紹了五種利用Python語言實(shí)現(xiàn)獲取內(nèi)網(wǎng)IP地址的方法,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以了解一下2023-03-03
關(guān)于python tushare Tkinter構(gòu)建的簡單股票可視化查詢系統(tǒng)(Beta v0.13)
這篇文章主要介紹了python tushare Tkinter構(gòu)建的簡單股票可視化查詢系統(tǒng)(Beta v0.13),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
python3+opencv 使用灰度直方圖來判斷圖片的亮暗操作
這篇文章主要介紹了python3+opencv 使用灰度直方圖來判斷圖片的亮暗操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06

