【Python】--裝飾器

裝飾器(Decorator)本質上是一個返回函數的函數
主要作用是:在不修改原函數代碼的前提下,給函數增加額外的功能
比如:增加業務,日志記錄、權限驗證、執行時間統計、緩存等場景

@my_decorator
def func():pass# 等價于:
def func():pass
func = my_decorator(func)

1、閉包

def outer(x):def inner(y):return x + yreturn inneradd5 = outer(5)
print(add5(3))  # 輸出 8

閉包(Closure)指一個函數定義在另一個函數內部,并且這個內部函數引用了外部函數的變量。即使外部函數已經返回了,內部函數依然**“記住”**并可以訪問這些變量
就如這里的x

功能
  • 保存函數執行時的“上下文”;

  • 用于延遲計算或構造回調函數;

  • 實現數據隱藏(類似于面向對象中的私有變量);

  • 替代某些簡單場景中的類。

2、裝飾器基礎

裝飾器本質上就是閉包的一種應用,用于在不修改函數源代碼的情況下增強函數功能


def decorator(func):def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)stop_time = time.time()print(f'running_time is {stop_time - start_time}')return resultreturn wrapper@decorator   # double=decorator(double)
def double(x):time.sleep(1) # 模擬耗時return x*2
double(10)

這里在原本的基礎上增加了(統計函數執行時間)功能

3、保留函數元數據

使用裝飾器后
裝飾器會覆蓋原函數的元數據
在這里插入圖片描述
使用functools.wraps裝飾內層函數可保留原函數元數據

import functools
import time# 裝飾器outer
def decorator(func):@functools.wraps(func)def wrapper(*args, **kwargs):'''這里是wrapper的注釋'''start_time = time.time()result = func(*args, **kwargs)stop_time = time.time()print(f'running_time is {stop_time - start_time}')return resultreturn wrapper
@decorator   # double=decorator(double)
def double(x):'''這里是doubled的注釋'''time.sleep(1) # 模擬耗時return x*2
double(10)
print(double.__name__)
print(double.__doc__)

在這里插入圖片描述

4、帶參數的裝飾器

需要使用三層函數來實現。最外層函數接收裝飾器參數,中間層函數接收原函數,最內層函數完成對原函數的調用以及附加功能。

def timer(time_consume):def decorator(func):@functools.wraps(func)def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)stop_time = time.time()if (stop_time - start_time>time_consume):print(f'running is {stop_time - start_time}')print(f'{func.__name__} is longer')return resultreturn wrapperreturn decorator
@timer(0.8)   # double=timer(0.8)(double)
def double(x):time.sleep(1) # 模擬耗時return x*2
double(10)

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

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

相關文章

AI教你學VUE——Gemini版

前端開發學習路線圖 (針對編程新手,主攻 Vue 框架) 總原則:先夯實基礎,再深入框架。 想象一下建房子,地基不牢,上面的高樓(框架)是蓋不起來的。HTML、CSS、JavaScript 就是前端的地基。 階段一…

神經網絡中之多類別分類:從基礎到高級應用

神經網絡中之多類別分類:從基礎到高級應用 摘要 在機器學習領域,多類別分類是解決復雜問題的關鍵技術之一。本文深入探討了神經網絡在多類別分類中的應用,從基礎的二元分類擴展到一對多和一對一分類方法。我們詳細介紹了 softmax 函數的原理…

Go Web 后臺管理系統項目詳解

Go Web 后臺管理系統項目詳解 一、背景介紹 這是一個基于 Go 語言開發的 Web 后臺管理系統,為筆者學習期間練手之作,較為粗糙 二、技術架構 后端 語言 :采用 Go 語言(Golang)編寫,因其簡潔高效、并發能…

【Python系列】Python 中的 HTTP 請求處理

💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

OS7.【Linux】基本指令入門(6)

目錄 1.zip和unzip 配置指令 使用 兩個名詞:打包和壓縮 打包 壓縮 Linux下的操作演示 壓縮和解壓縮文件 壓縮和解壓縮目錄 -d選項 2.tar Linux下的打包和壓縮方案簡介 czf選項 xzf選項 -C選項 tzf選項 3.bc 4.uname 不帶選項的uname -a選項 -r選項 -v選項…

windows系統 壓力測試技術

一、CPU壓測模擬 工具:CpuStres v2.0 官網:https://learn.microsoft.com/en-us/sysinternals/downloads/cpustres 功能:是一個工具類,用來模擬在一個進程中啟動最多64個線程,且可以獨立控制任何一個線程的啟動/暫停、…

64.搜索二維矩陣

給你一個滿足下述兩條屬性的 m x n 整數矩陣: 每行中的整數從左到右按非嚴格遞增順序排列。每行的第一個整數大于前一行的最后一個整數。 給你一個整數 target ,如果 target 在矩陣中,返回 true ;否則,返回 false 。 示…

在 PyTorch 中借助 GloVe 詞嵌入完成情感分析

一. Glove 詞嵌入原理 GloVe是一種學習詞嵌入的方法,它希望擬合給定上下文單詞i時單詞j出現的次數。使用的誤差函數為: 其中N是詞匯表大小,是線性層參數, 是詞嵌入。f(x)是權重項,用于平衡不同頻率的單詞對誤差的影響…

kotlin中 熱流 vs 冷流 的本質區別

🔥 冷流(Cold Flow) vs 熱流(Hot Flow)區別 特性冷流(Cold Flow)熱流(Hot Flow)數據生產時機每次 collect 才開始執行啟動時就開始生產、始終運行生命周期與 collect 者…

精益數據分析(44/126):深度解析媒體網站商業模式的關鍵要點

精益數據分析(44/126):深度解析媒體網站商業模式的關鍵要點 在創業與數據分析的探索道路上,我們不斷挖掘不同商業模式的核心要素,今天將深入剖析媒體網站商業模式。希望通過對《精益數據分析》相關內容的解讀&#xf…

Android學習總結之Java和kotlin區別

一、空安全機制 真題 1:Kotlin 如何解決 Java 的 NullPointerException?對比兩者在空安全上的設計差異 解析: 核心考點:Kotlin 可空類型系統(?)、安全操作符(?./?:)、非空斷言&…

[Survey]Remote Sensing Temporal Vision-Language Models: A Comprehensive Survey

BaseInfo TitleRemote Sensing Temporal Vision-Language Models: A Comprehensive SurveyAdresshttps://arxiv.org/abs/2412.02573Journal/Time2024 arxivAuthor北航 上海AI LabCodehttps://github.com/Chen-Yang-Liu/Awesome-RS-Temporal-VLM 1. Introduction 傳統遙感局限…

jmeter讀取CSV文件中文亂碼的解決方案

原因分析? CSV文件出現中文亂碼通常是因為文件編碼與JMeter讀取編碼不一致。常見場景: 文件保存為GBK/GB2312編碼,但JMeter以UTF-8讀取。文件包含BOM頭(如Windows記事本保存的UTF-8),但JMeter未正確處理。腳本讀取文…

Webview通信系統學習指南

Webview通信系統學習指南 一、定義與核心概念 1. 什么是Webview? 定義:Webview是移動端(Android/iOS)內置的輕量級瀏覽器組件,用于在原生應用中嵌入網頁內容。作用:實現H5頁面與原生應用的深度交互&…

【C++】C++中的命名/名字/名稱空間 namespace

C中的命名/名字/名稱空間 namespace 1、問題引入2、概念3、作用4、格式5、使用命名空間中的成員5.1 using編譯指令( 引進整個命名空間) ---將這個盒子全部打開5.2 using聲明使特定的標識符可用(引進命名空間的某個成員) ---將這個盒子中某個成員的位置打…

Arduino IDE中離線更新esp32 3.2.0版本的辦法

在Arduino IDE中更新esp32-3.2.0版本是個不可能的任務,下載文件速度極慢。網上提供了離線的辦法,提供了安裝文件,但是沒有3.2.0的版本。 下面提供了一種離線安裝方法 一、騰訊元寶查詢解決辦法 通過打開開發板管理地址:通過在騰…

【工具使用-數據可視化工具】Apache Superset

1. 工具介紹 1.1. 簡介 一個輕量級、高性能的數據可視化工具 官網:https://superset.apache.org/GitHub鏈接:https://github.com/apache/superset官方文檔:https://superset.apache.ac.cn/docs/intro/ 1.2. 核心功能 豐富的可視化庫&…

算法每日一題 | 入門-順序結構-三角形面積

三角形面積 題目描述 一個三角形的三邊長分別是 a、b、c,那么它的面積為 p ( p ? a ) ( p ? b ) ( p ? c ) \sqrt{p(p-a)(p-b)(p-c)} p(p?a)(p?b)(p?c) ?,其中 p 1 2 ( a b c ) p\frac{1}{2}(abc) p21?(abc) 。輸入這三個數字,…

MongoDB入門詳解

文章目錄 MongoDB下載和安裝1.MongoDBCompass字段簡介1.1 Aggregations(聚合)1.2 Schema(模式分析)1.3 Indexes(索引)1.4 Validation(數據驗證) 2.增刪改查操作2.1創建、刪除數據庫&…

從Oculus到Meta:Facebook實現元宇宙的硬件策略

Oculus的起步 Facebook在2014年收購了Oculus,這標志著其在虛擬現實(VR)領域的首次重大投資。Oculus Rift作為公司的旗艦產品,是一款高端的VR頭戴設備,它為用戶帶來了沉浸式的體驗。Facebook通過Oculus Rift&#xff0…