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