Python 兩種裝飾器

      網(wǎng)友投稿 599 2025-04-03

      Python 兩種裝飾器


      目錄

      帶參數(shù)的裝飾器(函數(shù))

      類裝飾器

      裝飾器(Decorators)是 Python 的一個(gè)重要部分。簡(jiǎn)單地說:他們是修改其他函數(shù)的功能的函數(shù)。他們有助于讓我們的代碼更簡(jiǎn)短,也更Pythonic(Python范兒)。

      帶參數(shù)的裝飾器(函數(shù))

      來想想這個(gè)問題,難道@wraps不也是個(gè)裝飾器嗎?但是,它接收一個(gè)參數(shù),就像任何普通的函數(shù)能做的那樣。那么,為什么我們不也那樣做呢? 這是因?yàn)椋?dāng)你使用@my_decorator語法時(shí),你是在應(yīng)用一個(gè)以單個(gè)函數(shù)作為參數(shù)的一個(gè)包裹函數(shù)。記住,Python里每個(gè)東西都是一個(gè)對(duì)象,而且這包括函數(shù)!記住了這些,我們可以編寫一下能返回一個(gè)包裹函數(shù)的函數(shù)。

      在函數(shù)中嵌入裝飾器

      我們回到日志的例子,并創(chuàng)建一個(gè)包裹函數(shù),能讓我們指定一個(gè)用于輸出的日志文件。

      注意:@wraps接受一個(gè)函數(shù)來進(jìn)行裝飾,并加入了復(fù)制函數(shù)名稱、注釋文檔、參數(shù)列表等等的功能。這可以讓我們?cè)谘b飾器里面訪問在裝飾之前的函數(shù)的屬性。

      from functools import wraps

      def 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)在將日志打到指定的logfile

      opened_file.write(log_string + '\n')

      return func(*args, **kwargs)

      return wrapped_function

      return logging_decorator

      @logit()

      def myfunc1():

      pass

      myfunc1()

      # Output: myfunc1 was called

      # 現(xiàn)在一個(gè)叫做 out.log 的文件出現(xiàn)了,里面的內(nèi)容就是上面的字符串

      @logit(logfile='func2.log')

      def myfunc2():

      pass

      myfunc2()

      # Output: myfunc2 was called

      # 現(xiàn)在一個(gè)叫做 func2.log 的文件出現(xiàn)了,里面的內(nèi)容就是上面的字符串

      類裝飾器

      沒錯(cuò),裝飾器不僅可以是函數(shù),還可以是類,相比函數(shù)裝飾器,類裝飾器具有靈活度大、高內(nèi)聚、封裝性等優(yōu)點(diǎn)。使用類裝飾器主要依靠類的__call__方法,當(dāng)使用 @ 形式將裝飾器附加到函數(shù)上時(shí),就會(huì)調(diào)用此方法。

      class Foo(object):

      def __init__(self, func):

      self._func = func

      def __call__(self):

      print ('class decorator runing')

      self._func()

      print ('class decorator ending')

      @Foo

      def bar():

      print ('bar')

      bar()

      functools.wraps

      Python

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:wps如何凍結(jié)單元格(wps凍結(jié)單元格怎么操作)
      下一篇:解密CRM管理系統(tǒng)多少錢?揭秘CRM系統(tǒng)的好處與費(fèi)用
      相關(guān)文章
      久久亚洲精品国产亚洲老地址 | 亚洲真人无码永久在线观看| 亚洲国产成人片在线观看无码 | 久久精品国产亚洲AV高清热| 亚洲av中文无码乱人伦在线播放| 久久久久亚洲AV无码专区桃色| 亚洲精品高清在线| 亚洲M码 欧洲S码SSS222| 国产偷国产偷亚洲高清在线| 亚洲av乱码一区二区三区按摩| 亚洲色成人网站WWW永久四虎| 亚洲精品一二三区| 亚洲精品无码你懂的| 亚洲国产成人久久精品大牛影视 | 亚洲人成网7777777国产| 亚洲日韩国产精品第一页一区| 亚洲日产无码中文字幕| 亚洲AV午夜成人片| 亚洲视频在线免费观看| 亚洲狠狠狠一区二区三区| 亚洲国产成人在线视频| 亚洲视频在线观看2018| 亚洲色大成网站WWW国产| 老牛精品亚洲成av人片| 亚洲av无码天堂一区二区三区| 亚洲国产人成中文幕一级二级| 久久久久亚洲AV成人网人人网站| 亚洲色成人网站WWW永久| 国产亚洲美女精品久久久久狼| 亚洲高清视频在线观看| 麻豆亚洲av熟女国产一区二| 91嫩草亚洲精品| 亚洲七久久之综合七久久| 亚洲风情亚Aⅴ在线发布| 亚洲福利视频一区二区| 亚洲日韩精品A∨片无码| 久久亚洲美女精品国产精品| 亚洲乱人伦精品图片| 亚洲精品国产av成拍色拍| 国产成人久久精品亚洲小说| 国产午夜亚洲不卡|