Python 裝飾器(Decorator)

文章目錄

      • 代碼解析
        • 1. 裝飾器定義 timer(func)
        • 2. 應用裝飾器 @timer
      • **執行流程**
      • **關鍵點**
      • **實際應用場景**
      • **改進版本(帶 `functools.wraps`)**

這是一個 Python 裝飾器(Decorator) 的示例,用于測量函數的執行時間。下面詳細解析它的工作原理和用法:


代碼解析

1. 裝飾器定義 timer(func)
def timer(func):def wrapper(*args, **kwargs):start = time.time()                     # 記錄開始時間result = func(*args, **kwargs)          # 執行被裝飾的函數end = time.time()                       # 記錄結束時間print(f"函數 {func.__name__} 執行時間: {end-start:.2f}秒")  # 打印耗時return result                           # 返回原函數的結果return wrapper
  • timer(func) 是一個裝飾器工廠函數,接收一個函數 func 作為參數。
  • wrapper(*args, **kwargs) 是實際替換原函數的包裝函數:
    • *args**kwargs 確保它可以處理任意參數(位置參數和關鍵字參數)。
    • 在調用原函數 func(*args, **kwargs) 前后分別記錄時間,計算并打印耗時。
    • 最后返回原函數的結果 result,確保裝飾器不影響原函數的功能。
2. 應用裝飾器 @timer
@timer
def long_running_function():time.sleep(2)
  • @timer 是語法糖,等價于:
    long_running_function = timer(long_running_function)
    
  • 調用 long_running_function() 時,實際執行的是 wrapper() 函數。

執行流程

  1. 調用 long_running_function()
  2. 進入 wrapper(*args, **kwargs)
    • 記錄 start 時間。
    • 執行原函數 func()(即 time.sleep(2))。
    • 記錄 end 時間,計算耗時并打印。
    • 返回原函數的結果(此處為 None,因為 time.sleep() 無返回值)。

輸出示例:

函數 long_running_function 執行時間: 2.00秒

關鍵點

  1. 裝飾器的作用

    • 在不修改原函數代碼的情況下,為其添加新功能(如日志、計時、權限檢查等)。
    • 符合 開放-封閉原則(對擴展開放,對修改封閉)。
  2. *args**kwargs

    • 確保裝飾器能處理任意參數的函數。例如:
      @timer
      def add(a, b):return a + b
      
      調用 add(1, b=2) 時,args(1,)kwargs{'b': 2}
  3. 函數屬性保留

    • 裝飾后函數的 __name__ 會變成 wrapper,可通過 functools.wraps 修復:
      from functools import wrapsdef timer(func):@wraps(func)def wrapper(*args, **kwargs):# ...原有邏輯return wrapper
      

實際應用場景

  • 性能分析:統計函數執行時間。
  • 日志記錄:記錄函數調用參數和結果。
  • 權限驗證:在函數執行前檢查用戶權限。
  • 緩存:緩存函數結果以避免重復計算(如 @lru_cache)。

改進版本(帶 functools.wraps

import time
from functools import wrapsdef timer(func):@wraps(func)  # 保留原函數的元信息(如 __name__)def wrapper(*args, **kwargs):start = time.time()result = func(*args, **kwargs)end = time.time()print(f"函數 {func.__name__} 執行時間: {end-start:.2f}秒")return resultreturn wrapper

這樣,long_running_function.__name__ 仍會返回 "long_running_function",而不是 "wrapper"

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77616.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77616.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77616.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git commit時自動生成Change-ID

創建全局鉤子目錄: 創建一個全局的Git hooks目錄: mkdir -p ~/.githooks 下載并設置commit-msg鉤子腳本: 下載Gerrit的commit-msg鉤子腳本,并放置在全局鉤子目錄中(如下載不了,可從本頁面附件中下載,“…

最新Ktransformers v0.24(Docker)并發部署DeepSeek-V3-0324模型

一、介紹 KTransformers v0.2.4 發布說明 我們非常高興地宣布,期待已久的 KTransformers v0.2.4 現已正式發布!在這個版本中,我們對整 體架構進行了重大重構,更新了超過 1 萬行代碼,為社區帶來了備受期待的多并發支…

飛牛私有云5大硬核功能實測!

📸 1. 智能相冊:AI搜圖原圖自由 - 自動備份:手機照片/視頻實時同步,支持RAW格式、實況照片無損備份,釋放128G手機秒變256G。 - AI黑科技: - 人臉識別:自動歸類人物相冊,輸入「媽媽…

webrtc pacer模塊(一) 平滑處理的實現

Pacer起到平滑碼率的作用,使發送到網絡上的碼率穩定。如下的這張創建Pacer的流程圖,其中PacerSender就是Pacer,其中PacerSender就是Pacer。這篇文章介紹它的核心子類PacingController及Periodic模式下平滑處理的基本流程。平滑處理流程中還有…

【android bluetooth 協議分析 01】【HCI 層介紹 1】【hci_packets.pdl 介紹】

在 AOSP 的藍牙協議棧 (Gabeldorsche) 中,hci_packets.pdl 是一個 協議描述語言文件,用于定義 HCI (Host Controller Interface) 層的數據包結構和通信協議。以下是詳細解析: 1. 文件作用 system/gd/hci/hci_packets.pdl 協議自動化生成&…

操作系統 4.2-鍵盤

鍵盤中斷初始化和處理 提取的代碼如下: // con_init 函數,初始化控制臺(包括鍵盤)的中斷 void con_init(void) {set_trap_gate(0x21, &keyboard_interrupt); } ? // 鍵盤中斷處理函數 .globl _keyboard_interrupt _keyboard…

深入理解Softmax函數及其在PyTorch中的實現

Softmax函數簡介 Softmax函數在機器學習和深度學習中,被廣泛用于多分類問題的輸出層。它將一個實數向量轉換為概率分布,使得每個元素介于0和1之間,且所有元素之和為1。 Softmax函數的定義 給定一個長度為 K K K的輸入向量 z [ z 1 , z 2 …

Vue 3 響應式更新問題解析

在 Vue 3 中,即使使用 reactive 或 ref 創建的響應式數據,當數據量很大時也可能出現更新不及時的情況。以下是原因和解決方案: 核心原因 ??響應式系統優化機制??: Vue 3 使用 Proxy 實現響應式,比 Vue 2 更高效但為…

異形遮罩之QML中的 `OpacityMask` 實戰

文章目錄 🌧? 傳統實現的問題👉 效果圖 🌈 使用 OpacityMask 的理想方案👉代碼如下🎯 最終效果: ? 延伸應用🧠 總結 在 UI 設計中,經常希望實現一些“異形區域”擁有統一透明度或顏…

數據可視化 —— 堆形圖應用(大全)

一、案例一:溫度堆積圖 # 導入 matplotlib 庫中的 pyplot 模塊,這個模塊提供了類似于 MATLAB 的繪圖接口, # 方便我們創建各種類型的可視化圖表,比如折線圖、柱狀圖、散點圖等 import matplotlib.pyplot as plt # 導入 numpy 庫&…

python工程中的包管理(requirements.txt)

pip install -r requirements.txtpython工程通過requirements.txt來管理依賴庫版本,上述命令,可以一把安裝依賴庫,類似java中maven的pom.xml文件。 參考 [](

操作系統 3.4-段頁結合的實際內存管理

段與頁結合的初步思路 虛擬內存的引入: 為了結合段和頁的優勢,操作系統引入了虛擬內存的概念。虛擬內存是一段地址空間,它映射到物理內存上,但對用戶程序是透明的。 段到虛擬內存的映射: 用戶程序中的段首先映射到虛…

【Amazon EC2】為何基于瀏覽器的EC2 Instance Connect 客戶端連接不上EC2實例

文章目錄 前言📖一、報錯先知?二、問題復現😯三、解決辦法🎲四、驗證結果👍五、參考鏈接🔗 前言📖 這篇文章將講述我在 Amazon EC2 上使用 RHEL9 AMI 時無法連接到 EC2 實例時所遇到的麻煩😖 …

Python學習筆記(二)(字符串)

文章目錄 編寫簡單的程序一、標識符 (Identifiers)及關鍵字命名規則:命名慣例:關鍵字 二、變量與賦值 (Variables & Assignment)變量定義:多重賦值:變量交換:(很方便喲) 三、輸入與輸出 (In…

Hydra Columnar:一個開源的PostgreSQL列式存儲引擎

Hydra Columnar 是一個 PostgreSQL 列式存儲插件,專為分析型(OLAP)工作負載設計,旨在提升大規模分析查詢和批量更新的效率。 Hydra Columnar 以擴展插件的方式提供,主要特點包括: 采用列式存儲&#xff0c…

es的告警信息

Elasticsearch(ES)是一個開源的分布式搜索和分析引擎,在運行過程中可能會產生多種告警信息,以提示用戶系統中存在的潛在問題或異常情況。以下是一些常見的 ES 告警信息及其含義和處理方法: 集群健康狀態告警 信息示例…

健康與好身體筆記

文章目錄 保證睡眠飯后百步走,活到九十九補充鈣質一副好腸胃肚子咕咕叫 健康和工作的取舍 以前對健康沒概念,但是隨著年齡增長,健康問題凸顯出來。 持續維護該文檔,健康是個永恒的話題。 保證睡眠 一是心態要好,沾枕…

vue實現在線進制轉換

vue實現在線進制轉換 主要功能包括: 1.支持2-36進制之間的轉換。 2.支持整數和浮點數的轉換。 3.輸入驗證(雖然可能存在不嚴格的情況)。 4.錯誤提示。 5.結果展示,包括大寫字母。 6.用戶友好的界面,包括下拉菜單、輸…

智體知識庫:poplang編程語言是什么?

問:poplang語言是什么 Poplang 語言簡介 Poplang(OPCode-Oriented Programming Language)是一種面向操作碼(Opcode)的輕量級編程語言,主要用于智體(Agent)系統中的自動化任務處理、…

二分查找5:852. 山脈數組的峰頂索引

鏈接:852. 山脈數組的峰頂索引 - 力扣(LeetCode) 題解: 事實證明,二分查找不局限于有序數組,非有序的數組也同樣適用 二分查找主要思想在于二段性,即將數組分為兩段。本體就可以將數組分為ar…