在python裏裝飾器python
其定義:裝飾器就是一個函數,用來裝飾其餘函數,就是給其餘函數添加功能。編程
裝飾器有兩個特色:函數
一、裝飾器不修改被裝飾函數的源碼;spa
二、裝飾器不鏽鋼被裝飾函數的調用方式。日誌
在編程中常常會有一些公共函數,在已經發布的程序中,爲了程序的穩定性原函數是不容許隨便修改其源代碼的,而且合做開發中也不容許修改調用方式,那麼若是要對原函數進行功能增長,怎麼辦呢?這時裝飾器解決了這個問題。code
裝飾器用到的知識:blog
一、函數能夠做爲變量傳遞給另外一個函數utf-8
二、函數的返回值也能夠是另外一個函數開發
裝飾器實現代碼:源碼
有一個公共函數,做用是寫日誌文件:
1 def write_log(filenmae, msg_info): 2 f = open(filenmae, 'a+', encoding='utf-8'); 3 f.write(msg_info+'\n') 4 f.close()
若是想對這個寫日誌文件函數增長一個寫文件時間監控,這裏增長一個寫日誌文件函數的裝飾器:
import time def write_log_time(func): def n_wite_log(filename,*msg_info): s_time=time.time() #參數:*msg_info 表明這個參數可傳遞也可不傳遞,例如只給文件名的日誌,內容爲記錄時間 func(filename,*msg_info) e_time=time.time() print('write log file times:%s' %(e_time-s_time)) return n_wite_log
使用方法爲在函數write_log前加一個@write_log_time
完整代碼:
import time def write_log_time(func): def n_wite_log(filename,*msg_info): s_time=time.time() #參數:*msg_info 表明這個參數可傳遞也可不傳遞,例如只給文件名的日誌,內容爲記錄時間 func(filename,*msg_info) e_time=time.time() print('write log file times:%s' %(e_time-s_time)) return n_wite_log @write_log_time def write_log(filenmae, msg_info): f = open(filenmae, 'a+', encoding='utf-8'); f.write(msg_info+'\n') f.close() write_log('log.txt', '記錄2')