深入解析 Python 中的裝飾器 —— 從基礎到實戰

1. 裝飾器基礎

1.1 什么是裝飾器?

????????裝飾器本質上是一個 Python 函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能。裝飾器的返回值也是一個函數對象。

1.2 語法糖:@ 符號

????????Python?提供了 @ 符號作為裝飾器的語法糖,使得裝飾器的使用更加簡潔明了。


2. 創建簡單裝飾器

????????下面是一個簡單的裝飾器示例,用于記錄函數執行時間:

import timedef timer_decorator(func):def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)end_time = time.time()print(f"{func.__name__} executed in {end_time - start_time:.4f} seconds")return resultreturn wrapper# 使用裝飾器
@timer_decorator
def slow_function():time.sleep(2)print("Function executed")slow_function()

???????在這個例子中,timer_decorator 是一個裝飾器函數,它接受一個函數作為參數,并返回一個新的函數 wrapper。wrapper 函數在執行原函數前后記錄時間,并打印執行時間。


3. 裝飾器的工作原理

????????當使用 @decorator 語法糖時,Python 實際上做了以下幾件事:

  1. 調用 decorator 函數,將目標函數作為參數傳入。
  2. 裝飾器函數返回一個新的函數(通常是包裝函數)。
  3. 將目標函數的引用替換為新函數的引用。

????????因此,@timer_decorator 等價于 slow_function = timer_decorator(slow_function)。


4. 帶參數的裝飾器

????????有時候,我們可能需要為裝飾器本身傳遞參數。這可以通過再嵌套一層函數來實現:

def repeat_decorator(times):def decorator(func):def wrapper(*args, **kwargs):for _ in range(times):result = func(*args, **kwargs)return resultreturn wrapperreturn decorator# 使用帶參數的裝飾器
@repeat_decorator(3)
def say_hello():print("Hello, World!")say_hello()

????????在這個例子中,repeat_decorator 是一個返回裝飾器的函數,它接受一個參數 times,表示目標函數需要被執行的次數。


5. 保留原函數的元數據

????????使用裝飾器后,原函數的元數據(如函數名、文檔字符串等)可能會丟失。為了保留這些元數據,可以使用 functools 模塊中的 wraps 裝飾器:

from functools import wrapsdef my_decorator(func):@wraps(func)def wrapper(*args, **kwargs):print("Something is happening before the function is called.")result = func(*args, **kwargs)print("Something is happening after the function is called.")return resultreturn wrapper@my_decorator
def example_function():"""This is an example function."""print("Hello from example_function!")print(example_function.__name__)  # 輸出: example_function
print(example_function.__doc__)   # 輸出: This is an example function.

6. 裝飾器的應用場景

  • 日志記錄:記錄函數的調用時間、參數和返回值。
  • 性能分析:測量函數的執行時間,找出性能瓶頸。
  • 訪問控制:根據用戶權限決定是否允許執行函數。
  • 事務處理:在函數執行前后開啟和提交事務。
  • 緩存:緩存函數的計算結果,避免重復計算。

????????裝飾器是 Python 中一個非常強大的特性,它允許我們以一種優雅且靈活的方式擴展函數的功能。通過掌握裝飾器的使用,我們可以編寫出更加模塊化、可重用和易于維護的代碼。希望本文能夠幫助你更好地理解和應用 Python 中的裝飾器。

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

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

相關文章

研究生面試常見問題

研究生面試是考研復試的重要環節,面試表現直接關系到錄取結果。以下從面試流程、常見問題分類及回答技巧等方面為您整理了相關內容,幫助您更好地準備面試。 一、研究生面試的基本流程 自我介紹:通常需要準備1分鐘左右的中文或英文自我介紹&a…

無人機避障與目標識別技術分析!

一、無人機避障技術 1. 技術實現方式 傳感器融合: 視覺傳感(RGB/雙目/紅外相機):基于SLAM(同步定位與地圖構建)實現環境建模,但依賴光照條件。 激光雷達(LiDAR)&…

Facebook隱私保護:從技術到倫理的探索

在這個數字化時代,隱私保護已成為公眾關注的焦點。Facebook,作為全球最大的社交媒體平臺之一,其用戶隱私保護問題更是引起了廣泛的討論。本文將從技術層面和倫理層面探討 Facebook 在隱私保護方面的努力和挑戰。 技術層面的隱私保護 在技術…

vmware17 虛擬機 ubuntu22.04 橋接模式,虛擬機無法接收組播消息

問題描述: 在一個項目中,宿主機win10中,使用的vmware17pro 虛擬機安裝的ubuntu22.04,按照網上的教程使用Qt綁定組播消息,在另外一個Ubuntu工控機上發送用wiresahrk抓包的組播消息 sudo tcpreplay -i enp1s0 --loop0 y…

《Operating System Concepts》閱讀筆記:p735-p737

《Operating System Concepts》學習第 62 天,p735-p737 總結,總計 3 頁。 一、技術總結 1.distributed system (1)定義 A collection of loosely coupled nodes interconnected by a communication network(一組通過通信網絡相互連接的松散耦合節點)…

NO.92十六屆藍橋杯備戰|圖論基礎-最小生成樹-Prim算法-Kruskal算法|買禮物|繁忙的都市|滑雪(C++)

一個具有n個頂點的連通圖,其?成樹為包含n-1條邊和所有頂點的極?連通?圖。對于?成樹來說,若砍去?條邊就會使圖不連通圖;若增加?條邊就會形成回路。 ?個圖的?成樹可能有多個,將所有?成樹中權值之和最?的樹稱為最??成樹…

小白從0學習網站搭建的關鍵事項和避坑指南(2)

以下是針對小白從零學習網站搭建的 進階注意事項和避坑指南(第二期),覆蓋開發中的高階技巧、常見陷阱及解決方案,幫助你在實戰中提升效率和質量: 一、進階技術選型避坑 1. 前端框架選擇 誤區:盲目追求最新…

Java的Servlet的監聽器Listener 筆記250417

Java的Servlet的監聽器Listener 筆記250417 分類1: 一、生命周期監聽器 監聽容器(如 Tomcat)中應用、會話或請求的創建與銷毀。 監聽器接口觸發事件典型用途ServletContextListener應用啟動 (contextInitialized)、關閉 (contextDestroyed)全局資源管…

網絡安全領域的AI戰略準備:從概念到實踐

網絡安全領域的AI準備不僅涉及最新工具和技術的應用,更是一項戰略必需。許多企業若因目標不明確、數據準備不足或與業務重點脫節而未能有效利用AI技術,可能面臨嚴重后果,包括高級網絡威脅數量的激增。 AI準備的核心要素 構建穩健的網絡安全…

[數據結構]2. 順序表

順序表 1. 介紹基本概念存儲方式優點缺點應用場景 2. 順序表操作SeqList.hSeqlist.c 1. 介紹 基本概念 順序表是用一組地址連續的存儲單元依次存儲線性表的數據元素。線性表是具有相同數據類型的 n 個數據元素的有限序列,在順序表中,元素之間的邏輯順序…

o3和o4-mini的升級有哪些亮點?

ChatGPT是基于OpenAI GPT系列的高性能對話生成AI,經過多代迭代不斷提升自然語言理解和生成能力。 在過去的一年中,OpenAI先后發布了GPT-4、GPT?4.1及多種mini版本,為不同使用場景提供靈活選擇。? 隨著用戶需求向更高效、更精準的推理和視覺…

Chrome漏洞可竊取數據并獲得未經授權的訪問權限

在發現兩個關鍵漏洞后,谷歌發布了Chrome瀏覽器的緊急安全更新。這些漏洞可能允許攻擊者竊取敏感數據并未經授權訪問用戶系統。 這些缺陷被識別為CVE-2025-3619和CVE-2025-3620,在Windows和Mac的135.0.7049.95/.96之前影響Chrome版本,影響Linux的135.0.7049.95/.96。該更新將在…

力扣面試150題--兩數之和 和 快樂數

Day 25 題目描述 思路 創建一個hashmap從前向后遍歷數組如果存在target-nums[i]在map中,記錄它們兩個的序號返回即可不存在,就將該元素放入map中,存放序號 注意:題目說的是必然存在唯一解 class Solution {public int[] twoSum…

Flutter_學習記錄_狀態管理之GetX

Flutter GetX 狀態管理框架全面解析 1. 狀態管理與 Flutter GetX 介紹 1.1 狀態管理 通俗理解:當我們需要在多個頁面(組件/Widget)之間共享狀態(數據),或者在一個頁面中的多個子組件之間共享狀態時&…

ASP.NET常見安全漏洞及修復方式

Microsoft IIS 版本信息泄露 查看網頁返回的 Header 信息&#xff0c;默認會包含 IIS&#xff0c;ASP.NET 版本信息&#xff1a; 隱藏 Server 標頭 編輯 web.config 文件&#xff0c;在 system.webServer 節點中配置 requestFiltering 來移除Server標頭&#xff1a; <sec…

深入解析Java日志框架Logback:從原理到最佳實踐

Logback作為Java領域最主流的日志框架之一,由Log4j創始人Ceki Glc設計開發,憑借其卓越的性能、靈活的配置以及與SLF4J的無縫集成,成為企業級應用開發的首選日志組件。本文將從架構設計、核心機制、配置優化等維度全面剖析Logback的技術細節。 一、Logback的架構設計與核心模…

OpenStack Yoga版安裝筆記(22)Swift筆記20250418

一、官方文檔 https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html#https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html# 二、對象存儲簡介&#xff08;Introduction to Object Storage&#xff09; OpenStack 對象存儲&a…

Spring Boot日志系統詳解:Logback與SLF4J的默認集成

大家好呀&#xff01;&#x1f44b; 今天我們來聊聊Spring Boot中一個超級重要但又經常被忽視的功能——日志系統&#xff01; 一、日志系統的重要性 首先&#xff0c;咱們得明白為什么日志這么重要&#xff1f;&#x1f937;?♂? 想象一下&#xff0c;你正在玩一個超級復…

【AI提示詞】退休規劃顧問專家

提示說明 隨著人口老齡化的加劇&#xff0c;越來越多的人開始關注退休規劃問題。一個專業的退休規劃顧問可以幫助用戶合理規劃退休生活&#xff0c;確保退休后的生活質量。 提示詞 # 角色 退休規劃顧問專家## 注意 1. 專家設計應符合退休規劃的專業性和可靠性&#xff0c;幫…

樓梯上下檢測數據集VOC+YOLO格式5462張2類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;5462 標注數量(xml文件個數)&#xff1a;5462 標注數量(txt文件個數)&#xff1a;5462 …