日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 装饰器理解

發布時間:2025/3/15 python 10 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 wrapper

    5、裝飾器的應用場景:

    裝飾器經常用于有切面需求的場景,比如:插入日志、性能測試、事務處理、緩存、 權限校驗等應用場景。

    裝飾器典型應用場景:

    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 装饰器理解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。