深入學習python裝飾器

2021-10-09 19:39:13 字數 2293 閱讀 5524

裝飾器:用於修改其他函式功能的物件,python裡一切都是物件,顧裝飾器可以是函式也可以是類(單個函式接收裝飾器,通過類可以實現多個功能,再通過繼承可以實現增強功能)。一般用於許可權驗證和日誌記錄模組。

函式裝飾器:

import time

from functools import wraps

# 計算函式的執行時間

defuse_time

(f):

@wraps(f)

definner()

: start_time = time.time(

)print

(f.__name__ +

'正在要執行'

) f(

) end_time = time.time(

)print(.

format

(name=f.__name__,s=end_time - start_time)

)return inner

# 呼叫裝飾器

@use_time

defpt()

: time.sleep(1)

print

("我執行中"

)pt(

)

類裝飾器:

import time

from functools import wraps

class

func_log

:def

__init__

(self, filename=

'out.txt'):

self.startime = time.time(

) self.endtime =

none

self.filename = filename

self.

str=

none

# 重寫call函式,實現類作為裝飾器的關鍵所在

def__call__

(self, func)

: @wraps(func)

defuse_time()

: self.

str=

"正要執行:"

.format

(name=func.__name__)

self.startime = time.time(

) func(

) self.endtime = time.time(

) self.new_func(

) self.sen_mail(

)return use_time

defnew_func

(self)

:print

('可新增新的功能'

)with

open

(self.filename,

'a')

as log:

log.write(self.

str+

'\n'

) log.write(

'本次日誌記錄完畢'

)print

('已經新增新的功能'

)def

sen_mail

(self)

:pass

class

func_log_pro

(func_log)

:def

__init__

(self, mail,

*args,

**kwargs)

: self.mail = mail

super

(func_log_pro, self)

.__init__(

*args,

**kwargs)

defsen_mail

(self)

:print(.

format

(mail=self.mail)

)# @func_tmie('mylog.txt')

@ func_log_pro(

'[email protected]'

,'mylog.txt'

)defpt(

):time.sleep(1)

print

('我要列印'

)if __name__ ==

'__main__'

: pt(

)

Python深入學習筆記(二)

計數器counter counter類是自python2.7起增加的,屬於字典類的子類,是乙個容器物件,主要用來統計雜湊物件,支援集合操作 其中後兩項分別返回兩個counter物件各元素的最小值和最大值。from collections import counter c counter succes...

python裝飾器以及裝飾器的深入

1.通 裝飾器回顧 通過裝飾器的模板格式 def fn def inner args,kwargs 增加的內容 ret fn args,kwargs 增加的內容 return ret return inner2.函式的有 資訊 1 獲取函式的注釋資訊,示例 def fun a,b,c 函式的功能 p...

Python深入05 裝飾器

裝飾器 decorator 是一種高階python語法。裝飾器可以對乙個函式 方法或者類進行加工。在python中,我們有多種方法對函式和類進行加工,比如在python閉包中,我們見到函式物件作為某乙個函式的返回結果。相對於其它方式,裝飾器語法簡單,可讀性高。因此,裝飾器在python專案中有廣泛的...