Python 两种装饰器
目錄
帶參數(shù)的裝飾器(函數(shù))
類裝飾器
裝飾器(Decorators)是 Python 的一個重要部分。簡單地說:他們是修改其他函數(shù)的功能的函數(shù)。他們有助于讓我們的代碼更簡短,也更Pythonic(Python范兒)。?
帶參數(shù)的裝飾器(函數(shù))
來想想這個問題,難道@wraps不也是個裝飾器嗎?但是,它接收一個參數(shù),就像任何普通的函數(shù)能做的那樣。那么,為什么我們不也那樣做呢? 這是因為,當你使用@my_decorator語法時,你是在應用一個以單個函數(shù)作為參數(shù)的一個包裹函數(shù)。記住,Python里每個東西都是一個對象,而且這包括函數(shù)!記住了這些,我們可以編寫一下能返回一個包裹函數(shù)的函數(shù)。
在函數(shù)中嵌入裝飾器
我們回到日志的例子,并創(chuàng)建一個包裹函數(shù),能讓我們指定一個用于輸出的日志文件。
注意:@wraps接受一個函數(shù)來進行裝飾,并加入了復制函數(shù)名稱、注釋文檔、參數(shù)列表等等的功能。這可以讓我們在裝飾器里面訪問在裝飾之前的函數(shù)的屬性。
from functools import wrapsdef logit(logfile='out.log'):def logging_decorator(func):@wraps(func)def wrapped_function(*args, **kwargs):log_string = func.__name__ + " was called"print(log_string)# 打開logfile,并寫入內(nèi)容with open(logfile, 'a') as opened_file:# 現(xiàn)在將日志打到指定的logfileopened_file.write(log_string + '\n')return func(*args, **kwargs)return wrapped_functionreturn logging_decorator@logit() def myfunc1():passmyfunc1() # Output: myfunc1 was called # 現(xiàn)在一個叫做 out.log 的文件出現(xiàn)了,里面的內(nèi)容就是上面的字符串@logit(logfile='func2.log') def myfunc2():passmyfunc2() # Output: myfunc2 was called # 現(xiàn)在一個叫做 func2.log 的文件出現(xiàn)了,里面的內(nèi)容就是上面的字符串?
類裝飾器
沒錯,裝飾器不僅可以是函數(shù),還可以是類,相比函數(shù)裝飾器,類裝飾器具有靈活度大、高內(nèi)聚、封裝性等優(yōu)點。使用類裝飾器主要依靠類的__call__方法,當使用 @ 形式將裝飾器附加到函數(shù)上時,就會調(diào)用此方法。
class Foo(object):def __init__(self, func):self._func = funcdef __call__(self):print ('class decorator runing')self._func()print ('class decorator ending')@Foo def bar():print ('bar')bar() functools.wraps?
?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Python 两种装饰器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【每日SQL打卡】
- 下一篇: 《算法小白历险记》3.最长公共前缀【py