python @裝飾器的用法

裝飾器(decorators)是 Python 中的一種高級特性,它允許開發者修改函數或方法的行為,而不改變其定義。裝飾器通常用于日志記錄、權限檢查、性能測量等場景。裝飾器是通過在函數定義的前一行加上 @decorator_name 來使用的。

基本用法

裝飾器本質上是一個函數,它接受一個函數作為參數,并返回一個新的函數。以下是一個簡單的裝飾器示例:

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()

輸出:

Something is happening before the function is called.
Hello!
Something is happening after the function is called.

在這個例子中:

  • my_decorator 是裝飾器函數。
  • say_hello 是被裝飾的函數。
  • @my_decorator 語法相當于 say_hello = my_decorator(say_hello)

帶參數的裝飾器

如果需要在裝飾器中傳遞參數,可以使用多層嵌套函數來實現:

def repeat(num_times):def decorator_repeat(func):def wrapper(*args, **kwargs):for _ in range(num_times):func(*args, **kwargs)return wrapperreturn decorator_repeat@repeat(num_times=3)
def greet(name):print(f"Hello {name}")greet("World")

輸出:

Hello World
Hello World
Hello World

在這個例子中:

  • repeat 是一個帶參數的裝飾器工廠,它返回一個裝飾器。
  • decorator_repeat 是實際的裝飾器。
  • wrapper 是包裝函數,負責多次調用被裝飾的函數 func

類裝飾器

裝飾器也可以用于類。類裝飾器是通過定義一個實現 __call__ 方法的類來實現的:

class MyDecorator:def __init__(self, func):self.func = funcdef __call__(self, *args, **kwargs):print("Class-based decorator before function call.")result = self.func(*args, **kwargs)print("Class-based decorator after function call.")return result@MyDecorator
def say_goodbye():print("Goodbye!")say_goodbye()

輸出:

Class-based decorator before function call.
Goodbye!
Class-based decorator after function call.

在這個例子中:

  • MyDecorator 類實現了 __call__ 方法,使其實例可以像函數一樣被調用。
  • say_goodbye 函數被 MyDecorator 實例裝飾。

裝飾器的實際應用

裝飾器在實際開發中非常有用,以下是一些常見的應用場景:

  1. 日志記錄:在函數執行前后記錄日志。
  2. 權限檢查:在執行函數前檢查用戶是否有權限。
  3. 性能測量:計算函數執行時間。
  4. 緩存:緩存函數的返回值,以提高性能。
  5. 輸入校驗:在函數執行前校驗輸入參數。

示例:日志記錄裝飾器

import functoolsdef log_decorator(func):@functools.wraps(func)def wrapper(*args, **kwargs):print(f"Calling {func.__name__} with {args} and {kwargs}")result = func(*args, **kwargs)print(f"{func.__name__} returned {result}")return resultreturn wrapper@log_decorator
def add(a, b):return a + badd(2, 3)

輸出:

Calling add with (2, 3) and {}
add returned 5

在這個例子中:

  • @functools.wraps(func) 保留了被裝飾函數的元數據(如文檔字符串和函數名)。
  • log_decorator 在函數執行前后打印日志信息。

裝飾器是一個強大而靈活的工具,能夠極大地增強代碼的可復用性和可讀性。通過合理使用裝飾器,可以使代碼更加簡潔、優雅。

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

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

相關文章

Qt簡單文本查找

Qt版本&#xff1a; Qt6 具體代碼&#xff1a; 1. 頭文件 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>class QLineEdit; class QDialog; class QPushButton; class QVBoxLayout; class QTextEdit;QT_BEGIN_NAMESPACE namespace Ui…

為什么AI算法工程師要求C++?

在開始前剛好我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「c&#xff0b;&#xff0b;的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“666”之后私信回復“666”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff01;能跑出…

找到字符串中所有子串出現的位置python

直接find干就完了。 如果你希望找到字符串中所有子串出現的位置&#xff0c;而不僅僅是一個位置&#xff0c;你可以通過循環查找并收集所有起始位置。以下是修改后的代碼&#xff1a; def find_all_substring_positions(string, substring): positions [] # 用于存儲所有…

與枚舉結合的策略模式

枚舉類&#xff1a; package com.dtranx.tools.corpora.businessapi.enums;import com.dtranx.tools.commons.vo.EnumResponseVo; import com.google.common.collect.Lists;import java.util.List;/*** ClassName SimpleSearchMode* Description TODO* Date 2024/5/28 15:55* A…

VTK- 可視化過程 四種坐標系統

可視化工具包 VTK(Visualization Toolkit),是一種開源的可視化軟件系統,主要實現計算機圖形學、圖像分析、渲染、圖像處理等功能。VTK 包含一個 C類庫和多個不同語言調用接口層&#xff0c;主要針對2D、3D 圖像和可視化用圖設計。 VTK設計作為一個工具包&#xff0c;不依賴于特…

學校衛星電子怎么自動校準時間呢

在學校的教室里&#xff0c;衛星電子鐘精準地為師生們提供著時間服務&#xff0c;而其自動校準時間的功能令人稱奇。那么&#xff0c;學校衛星電子鐘是如何實現自動校準時間的呢&#xff1f; 學校衛星電子鐘自動校準時間的原理基于衛星導航系統。常見的如北斗衛星導航系統或 GP…

知迪科技驚艷亮相高工智能汽車開發者大會,精彩演講直擊行業痛點、探索未來趨勢

6月27-28日&#xff0c;高工智能汽車開發者大會在上海隆重舉行&#xff0c;知迪科技受邀攜產品與解決方案出席此次大會。 智能汽車已經進入跨域融合新時代。為了進一步降低成本和增強協同&#xff0c;汽車電子架構的設計開始向跨域融合方向演進&#xff0c;并且變革的速度在加快…

java 面試題 - 索引

上腦圖&#xff0c;大家要記住&#xff01;&#xff01; 看不清&#xff0c;上大圖&#xff01; 這幾總結就夠用&#xff01;&#xff01;

nginx優化和防盜鏈

1、隱藏版本號 [roottest1 conf]# vim nginx.conf ? server_tokens off; ? 2、防盜鏈 修改用戶和所在組 [roottest1 conf]# vim nginx.conf ? #user nginx nginx; #表示主進程master會有root創建&#xff0c;子進程會有nginx用戶來創建。 3、設置頁面的緩存時間 主要是…

ExoPlayer架構詳解與源碼分析(14)——ProgressiveMediaPeriod

系列文章目錄 ExoPlayer架構詳解與源碼分析&#xff08;1&#xff09;——前言 ExoPlayer架構詳解與源碼分析&#xff08;2&#xff09;——Player ExoPlayer架構詳解與源碼分析&#xff08;3&#xff09;——Timeline ExoPlayer架構詳解與源碼分析&#xff08;4&#xff09;—…

高考完的假期想學c語言 要注意那些問題?

在開始前剛好我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「c語言的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“666”之后私信回復“666”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff01;其實建議高考完之后好好玩一…

線上問題定位分析寶典——Linux中定位JVM問題常用命令

查詢Java進程ID #ps axu | grep java #ps elf | grep java查看機器負載及CPU信息 #top -p 1(進程ID) #top (查看所有進程)獲取CPU飆升線程堆棧 1. top -c 找到CPU飆升進程ID&#xff1b; 2. top -Hbp 9702(替換成進程ID) 找到CPU飆升線程ID&#xff1b; 3. $ printf &quo…

Java 7新特性深度解析:提升效率與功能

文章目錄 Java 7新特性深度解析&#xff1a;提升效率與功能一、Switch中添加對String類型的支持二、數字字面量的改進三、異常處理&#xff08;捕獲多個異常&#xff09;四、增強泛型推斷五、NIO2.0&#xff08;AIO&#xff09;新IO的支持六、SR292與InvokeDynamic七、Path接口…

64.ThreadLocal造成的內存泄漏

內存泄漏 程序中已動態分配的堆內存,由于某種原因程序為釋放和無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重后果。內存泄漏的堆積終將導致內存溢出。 內存溢出 沒有足夠的內存提供申請者使用。 ThreadLocal出現內存泄漏的真實原因 內存泄漏的發…

Java中的多線程與并發編程詳解

Java中的多線程與并發編程詳解 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在當今軟件開發中&#xff0c;利用多核處理器的能力并行執行任務已成為提高應用…

Transformer拆積木

文章目錄 ConceptsEmbeddingEncoderDecoderSelf-Attention matric calculationFinal Linear and Softmax LayerLoss function 參考 學一下已經問鼎中原七年之久的Transformer Concepts 開始拆積木&#xff01; Embedding Encoder Decoder Self-Attention matric calculati…

【文檔+源碼+調試講解】科研經費管理系統

目 錄 目 錄 摘 要 ABSTRACT 1 緒論 1.1 課題背景 1.2 研究現狀 1.3 研究內容 2 系統開發環境 2.1 vue技術 2.2 JAVA技術 2.3 MYSQL數據庫 2.4 B/S結構 2.5 SSM框架技術 3 系統分析 3.1 可行性分析 3.1.1 技術可行性 3.1.2 操作可行性 3.1.3 經濟可行性 3.1…

解析服務器地址異常的原因和解決方法

在網絡利用開發和運維進程中&#xff0c;解析服務器地址異常是常見的問題之一。特別是在觸及到跨境業務和國際網絡傳輸時&#xff0c;由于網絡環境的復雜性&#xff0c;解析服務器地址異常可能會致使用戶沒法正常訪問網站或利用程序。 解析服務器地址異常可能由多種緣由引發&am…

虛擬機的網絡配置

&#x1f4d1;打牌 &#xff1a; da pai ge的個人主頁 &#x1f324;?個人專欄 &#xff1a; da pai ge的博客專欄 ?? 每一步都向著夢想靠近&#xff0c;堅持就是勝利的序曲 一 …

手機系統設置選項

通用設置選項 1. 忽略電池優化選項 參考 https://blog.csdn.net/dodod2012/article/details/132045963 <uses-permission android:name"android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>public static boolean isIgnoreBatteryOption(Context c…