Python 装饰器理解
生活随笔
收集整理的這篇文章主要介紹了
Python 装饰器理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、定義:
(1)裝飾器指的是為被裝飾對象添加額外功能的工具/函數。
2、使用裝飾器的意義(原因):
如果我們已經上線了一個項目,我們需要修改某一個方法,但是我們不想修改方法的使用方法,這個時 候可以使用裝飾器。因為軟件的維護應該遵循開放封閉原則,即軟件一旦上線運行后,軟件的維護對修改源代碼是封閉的,對擴展功能指的是開放的。
3、裝飾器的實現必須遵循兩大原則:
4、如何實現裝飾器?
裝飾器本質上是一個函數,該函數用來處理其他函數,它可以讓其他函數在不需要修改代碼的前提下增加額外的功能,裝飾器的返回值也是一個函數對象。
*******飾器的通用模板*******(很重要)
from functools import wrapsdef function(func): #func===被裝飾的函數@wraps(func) #保留被裝飾函數的名字和幫助文檔def wrapper(*args, **kwargs): #形參,可變參數(元組),關鍵字參數(字典)"""被裝飾函數前需要添加的內容"""result = func(*args, **kwargs) # 實參,解包"""被裝飾函數后需要添加的內容"""return resultreturn wrapper5、裝飾器的應用場景:
裝飾器經常用于有切面需求的場景,比如:插入日志、性能測試、事務處理、緩存、 權限校驗等應用場景。
裝飾器典型應用場景:
Django框架裝飾器應用:http://y.tsutsumi.io/dry-principles-through-python-decorators.html
(1)插入日志
from functools import wraps# 定義裝飾器 def logger(func):"""插入日志的裝飾器"""@wraps(func)def wrapper(*args, **kwargs):print("函數%s開始執行" % (func.__name__))result = func(*args, **kwargs)print("函數%s執行結束" % (func.__name__))return resultreturn wrapper# 使用裝飾器 @logger # 語法糖 執行: login = logger(login) 將login通過logger函數進行裝飾,返回wrapper def login(username, password):if username == 'root' and password == '123':print('login ok')print('%s login ok' % (username))else:print('login failed')print('%s login failed' % (username))if __name__ == '__main__':login('root', '123') # 實質執行的是wrapper函數 # ---- 運行結果----- # 函數login開始執行 # login ok # root login ok # 函數login執行結束(2)性能測試
比如:計算代碼運行時間
from functools import wraps import timedef timeit(func): # 2 func=download_music"""打印被裝飾函數運行總時間的裝飾器"""# @wraps保留被裝飾函數的函數名和幫助文檔, 否則是wrapper的信息.@wraps(func)def wrapper(*args, **kwargs): # 5 args=('Music', ), kwargs={}start_time = time.time()result = func(*args, **kwargs) # 6 func('Music')=download_music('Music')end_time = time.time()print("%s函數運行總時間為%fs" %(func.__name__, end_time-start_time))return result # 7return wrapper # 3@timeit # 1 @timeit實質上執行的內容: download_music = timeit(download_music) = wrapper def download_music(name): # 7time.sleep(0.4)print('[Download]: ', name)return True# 調用download_music函數時實質上調用的是wrapper函數。 download_music('Music') # 4運行結果:
[Download]: Music download_music函數運行總時間為0.420078s參考自https://blog.csdn.net/daidadeguaiguai/article/details/103672492
總結
以上是生活随笔為你收集整理的Python 装饰器理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器推技术相关网址
- 下一篇: tensorflow9-mnist手写数