探索Python裝飾器:優雅地增強函數功能

Python 裝飾器是一種高級功能,允許你在不修改原始函數代碼的情況下,動態地修改或擴展函數的行為。

基本語法

裝飾器是一種特殊的函數,其基本語法如下:

def decorator_function(func):def wrapper(*args, **kwargs):# 在調用原始函數之前的操作result = func(*args, **kwargs)# 在調用原始函數之后的操作return resultreturn wrapper

常用命令

  • @decorator_function:將裝飾器應用到函數上的語法糖。
  • decorator_function:裝飾器函數本身。

示例

示例 1:簡單裝飾器
def my_decorator(func):def wrapper():print("Something is happening before the function is called.")func()print("Something is happening after the function is called.")return wrapper@my_decorator
def say_hello():print("Hello!")say_hello()
示例 2:帶參數的裝飾器
def repeat(num_times):def decorator_repeat(func):def wrapper(*args, **kwargs):for _ in range(num_times):result = func(*args, **kwargs)return resultreturn wrapperreturn decorator_repeat@repeat(num_times=3)
def greet(name):print(f"Hello {name}")greet("Alice")

應用場景

1. 日志記錄

裝飾器在日志記錄中發揮著重要作用,它可以捕獲函數的輸入參數、執行時間以及輸出結果,從而方便開發人員跟蹤函數的執行過程和調試代碼。通過裝飾器記錄日志,可以提高代碼的可讀性和可維護性。

示例代碼

import logging
import timedef log_decorator(func):def wrapper(*args, **kwargs):logging.info(f"Calling function {func.__name__} with args: {args}, kwargs: {kwargs}")start_time = time.time()result = func(*args, **kwargs)end_time = time.time()logging.info(f"Function {func.__name__} executed in {end_time - start_time} seconds with result: {result}")return resultreturn wrapper@log_decorator
def add(x, y):return x + yresult = add(3, 5)
print("Result:", result)
2. 性能監控

裝飾器在性能監控方面也具有重要作用,它可以幫助開發人員監控函數的執行時間,發現潛在的性能瓶頸并進行優化。通過裝飾器進行性能監控,可以提高代碼的效率和性能。

示例代碼

import timedef performance_decorator(func):def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)end_time = time.time()print(f"Function {func.__name__} executed in {end_time - start_time} seconds")return resultreturn wrapper@performance_decorator
def calculate_factorial(n):factorial = 1for i in range(1, n + 1):factorial *= ireturn factorialresult = calculate_factorial(10)
print("Factorial:", result)
3. 權限驗證

裝飾器可以用于權限驗證,例如檢查用戶是否具有執行特定操作的權限。這種方式使得權限驗證邏輯與業務邏輯分離,提高了代碼的模塊化和可維護性。

示例代碼

def permission_required(permission):def decorator(func):def wrapper(*args, **kwargs):if check_permission(permission):return func(*args, **kwargs)else:raise PermissionError("Permission denied")return wrapperreturn decoratordef check_permission(permission):# 檢查用戶是否具有指定權限的邏輯return True  # 此處僅為示例,實際需根據業務邏輯實現@permission_required("admin")
def delete_user(user_id):# 刪除用戶的邏輯print(f"User {user_id} deleted successfully")delete_user(123)

注意事項

1. 裝飾器順序

當多個裝飾器應用于同一個函數時,它們的執行順序與它們在代碼中的順序相反。這意味著最先定義的裝飾器實際上會最后執行,而最后定義的裝飾器會最先執行。

示例代碼

def decorator1(func):def wrapper():print("Decorator 1 executed")func()return wrapperdef decorator2(func):def wrapper():print("Decorator 2 executed")func()return wrapper@decorator1
@decorator2
def greet():print("Hello!")greet()

輸出結果為:

Decorator 1 executed
Decorator 2 executed
Hello!
2. 裝飾器的參數

如果裝飾器本身需要接受參數,則需要在裝飾器函數外再包裹一層函數。這樣的裝飾器稱為帶參數的裝飾器。在定義帶參數的裝飾器時,外層函數接受裝飾器參數,內層函數接受被裝飾函數。

示例代碼

def decorator_with_param(param):def decorator(func):def wrapper():print(f"Decorator with parameter {param} executed")func()return wrapperreturn decorator@decorator_with_param("test")
def greet():print("Hello!")greet()

輸出結果為:

Decorator with parameter test executed
Hello!

總結

裝飾器是 Python 中一種強大的工具,可用于動態修改函數的行為,常用于日志記錄、性能監控、權限驗證等場景。通過合理使用裝飾器,可以提高代碼的靈活性、可重用性和可維護性。

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

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

相關文章

【WP|9】深入解析WordPress [add_shortcode]函數

add_shortcode 是 WordPress 中一個非常強大的函數,用于創建自定義的短代碼(shortcodes)。短代碼是一種簡潔的方式,允許用戶在內容中插入動態的、可重用的功能。通過 add_shortcode,開發者可以定義自己的短代碼&#x…

【MMU】——MMU 相關的 CP15 寄存器

文章目錄 MMU 相關的 CP15 寄存器C1(System Control Register)C2(Translation Table Base Control Register)C3(Domain Access Control Register)C5(Data Fault Status Register)C6(Data Fault Address Register)C9C10MMU 相關的 CP15 寄存器 寄存器作用寄存器 C1 中…

前端開發環境:Vue、Element Plus、Axios

目錄 1. Vue簡介 2. Element Plus簡介 3. Axios簡介 4. 創建Vue項目 4.1 Node.js安裝 4.2 創建Vue項目 4.3 Vue項目的結構 4.4 安裝Element-Plus 4.5 安裝Axios 4.6 解決跨域問題 5. 應用實例 5.1 創建Vue組件 5.2 配置路由 5.3 配置根組件 5.4 啟動前端應用服…

Vue 爺孫組件通訊之:Provide / Inject 詳細介紹

背景 在父子組件傳遞數據時,通常使用的是 props 和 emit,父傳子時,使用的是 props,如果是父組件傳孫組件時,層層傳遞非常麻煩。 對于這種情況,我們可以使用一對 provide 和 inject。無論組件層次結構有多深…

在不受支持的 Mac 上安裝 macOS Sonoma (OpenCore Legacy Patcher v1.5.0)

在不受支持的 Mac 上安裝 macOS Sonoma (OpenCore Legacy Patcher v1.5.0) Install macOS on unsupported Macs 請訪問原文鏈接:https://sysin.org/blog/install-macos-on-unsupported-mac/,查看最新版。原創作品,轉載請保留出處。 作者主…

【leetcode--30.串聯所有單詞的子串】

有沒有一樣喜歡看示例的,,看題目就覺得很難懂。大致就是words要進行排列組合,返回s中所有包含這個排列組合的首標。 順完邏輯蠻好懂的,應該不算困難題,只是不知道用什么模塊實現。 class Solution:def findSubstring…

如何利用Varjo混合現實技術改變飛機維修訓練方式

自2017年以來,總部位于休斯頓的HTX實驗室一直在推進混合現實技術,與美國空軍密切合作,通過其EMPACT平臺提供可擴展的沉浸式飛機維護虛擬現實培訓。 虛擬和混合現實對維修訓練的好處: l 實踐技能:提供一個非常接近真實場…

【C++題解】1074 - 小青蛙回來了

問題:1074 - 小青蛙回來了 類型:需要找規律的循環 題目描述: 關于小青蛙爬井的故事,你應該早就聽過了:井深10 尺,小青蛙從井底向上爬,每個白天向上爬 3 尺,每個晚上又滑下來 2 尺&…

Java | Leetcode Java題解之第136題只出現一次的數字

題目: 題解: class Solution {public int singleNumber(int[] nums) {int single 0;for (int num : nums) {single ^ num;}return single;} }

App UI 風格,盡顯魅力

精妙無比的App UI 風格

Eclipse添加C和C++編譯成匯編文件的選項

在miscellaneous中添加assemble listing選項就可以生成匯編文件了

[自學記錄09*]Unity Shader:在Unity里渲染一個黑洞

一、前言 記得很久很久以前,在ShaderToy上看過一個黑洞的效果,當時感覺太*8帥了,于是這幾天就嘗試自己弄了一個。 Gargantua With HDR Bloom (shadertoy.com) 下面是我自己實現的黑洞 可以看到還是略遜一籌(感覺略遜百籌&#x…

什么是容器技術

容器虛擬化技術是一種有效的將單個操作系統的資源劃分到獨立的組中的技術,以便更好地在獨立的組之間平衡有沖突的資源使用需求。這種技術通過“偽造”操作系統的接口,將函數庫層以上的功能置于操作系統上,從而實現應用程序級別的虛擬化。容…

07-指針的概念與引用,索引

指針的概念與引用,索引 一、內存地址 字節: 定義: 字節(byte)是內存容量的一個單位,一個字節包含8個位(bit)。 地址: 定義: 內存地址是系統為了方便區分…

Java 主鍵生成策略之雪花算法

概述 項目中為了緩解數據庫服務器壓力和提高并發量進行分庫分表,在新增數據時,如果此時按照傳統方式使用數據庫主鍵自增,那么在并發下ID可能會沖突; 使用UUID的話又因其無序會產生頁分裂導致磁盤IO過大使得系統性能降低; 經過了解雪花算法根據其特點可以解決分布式系統中生成…

DockerCompose中部署Jenkins(Docker Desktop在windows上數據卷映射)

場景 DockerJenkinsGiteeMaven項目配置jdk、maven、gitee等拉取代碼并自動構建以及遇到的那些坑: DockerJenkinsGiteeMaven項目配置jdk、maven、gitee等拉取代碼并自動構建以及遇到的那些坑_jenkins的安裝以及集成jdkgitmaven 提示警告-CSDN博客 Windows10(家庭版…

AI學習指南機器學習篇-邏輯回歸正則化技術

AI學習指南機器學習篇-邏輯回歸正則化技術 在機器學習領域,邏輯回歸是一種常見的分類算法,它常用于處理二分類問題。在實際的應用中,為了提高模型的泛化能力和降低過擬合風險,邏輯回歸算法通常會使用正則化技術。本文將介紹邏輯回…

待定待定待定

BindingNavigator C# 屬性&#xff08;Property&#xff09; get set StringBuilder https://www.bilibili.com/video/BV15u4y1F72C/ C# 高級數據結構有哪些 List - 動態數組&#xff0c;可以動態增長和縮減&#xff0c;提供快速訪問、添加和刪除元素的功能。Dictionary<TK…

c#vb代碼互轉工具

下載地址&#xff1a; https://download.csdn.net/download/wgxds/88979921

EN 17104-2021室內用熱塑性硬質保護墻板CE認證

室內用熱塑性硬質保護墻板是指由同材質或非均質塑料板制成的&#xff0c;表面有或者沒有裝飾層&#xff0c;用于墻體的保護作用而非起結構作用&#xff0c;通過膠粘劑粘貼安裝。 EN 17104-2021室內用熱塑性硬質保護墻板CE認證項目 認證項目 測試標準 防火 EN 13501-1 揮發…