当前位置: 首页 > article >正文

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"

相关文章:

Python 装饰器(Decorator)

文章目录 代码解析1. 装饰器定义 timer(func)2. 应用装饰器 timer **执行流程****关键点****实际应用场景****改进版本(带 functools.wraps)** 这是一个 Python 装饰器(Decorator) 的示例,用于测量函数的执行时间。下…...

QCustomPlot频谱图

使用QCutomPlot做的读取txt文件显示频谱图的demo,帮助大家了解QCustomPlot的基本使用 1.运行结果 demo比较简单,用于文件读取,鼠标放大缩小,右键截图等基础功能. 2.绘图详解 绘图核心是将类提升为QCustomPlot之后进行重绘,重绘之前设计图表曲线,图标标题,坐标轴,坐标轴范围,背…...

高并发的业务场景下,如何防止数据库事务死锁

一、 一致的锁定顺序 定义: 死锁的常见原因之一是不同的事务以不同的顺序获取锁。当多个事务获取了不同资源的锁,并且这些资源之间发生了互相依赖,就会形成死锁。 解决方法: 确保所有的事务在获取多个锁时,按照相同的顺序请求锁。例如,如果事务A需要锁定表A和表B,事务…...

【Grok 大模型深度解析】第二期:架构探秘与训练哲学

在上一期的内容中,我们对 Grok 大模型从技术溯源的角度,了解了它从 Transformer 架构局限性出发,迈向混合架构创新的历程,同时也梳理了从 Grok - 1 到 Grok - 3 的版本迭代所带来的技术跃迁以及其独特的差异化优势。这一期,我们将深入到 Grok 大模型的架构内部,探究其精妙…...

Spring Boot(九十):集成SSE (Server-Sent Events) 服务器实时推送

1 SSE简介 Server-sent Events(SSE) 是一种基于 HTTP 协议的服务器推送技术,它允许服务器主动向客户端发送数据。与 WebSocket 不同,SSE 是单向通信,即服务器可以主动向客户端推送数据,而客户端只能接收数据。 2 SSE特点 单向通信:SSE 是服务器向客户端的单向推送,客户…...

2025第四届大学生算法挑战赛(进阶训练1) A-E 题解报告

前言 这是第四届大学生算法挑战赛的练习赛系列,这个比赛是国家一级协会的。 这章是进阶训练1的A-E题,感觉还是蛮基础的。 题解 第四届大学生算法挑战赛 进阶训练1 A. 小理养鱼 思路: 博弈 斐波那契数组 省流描述: 经典的羊狼博弈,即1只…...

P8668 [蓝桥杯 2018 省 B] 螺旋折线

题目 思路 一眼找规律题,都 1 0 9 10^9 109说明枚举必然超时,找规律,每个点找好像没有什么规律,尝试找一下特殊点,比如:对角线上的点 4 16 36(右上角) 4k^2,看在第几层(…...

Matlab 三容水箱系统故障诊断算法研究

1、内容简介 Matlab 190-三容水箱系统故障诊断算法研究 可以交流、咨询、答疑 2、内容说明 略 其次,对 DTS200 三容水箱系统进行机理建模,可分为对象建模和故障 建模,搭建了水箱系统的 SIMULINK 模型并建立了基于 Taylor 展开及 T-…...

查看容器内的eth0网卡对应宿主机上的哪块网卡

查看容器内的eth0网卡对应宿主机上的哪块网卡 问题描述解决办法1. 进入容器,查看网卡的iflink(接口链路索引)值方法1:方法2: 2. 从宿主机过滤查询到的iflink(接口链路索引)值3. 确定veth接口连接的网桥方法2: brctl查看连接到网桥的接口--推荐 4. 查看网桥连接的物理网卡 问题描…...

【 Beautiful Soup (bs4) 详解】

引言 Beautiful Soup 是 Python 最流行的 HTML/XML 解析库,能够从复杂的网页文档中高效提取数据。以下是其核心知识点及示例代码。 一、库简介 1. 核心模块 BeautifulSoup:主类,用于构建文档树结构Tag:表示 HTML/XML 标签的对象…...

RT-DETR-R18版本的ultralytics的yaml更改分享!!

0.前言 起因: 本人深度学习,无奈组内没有好的显卡,只有我自己拥有的一张4060卡跑CV,稍微大一点的模型跑不了,我的模型主打一个轻量化... 在找模型与我的模型进行比较的时候,看的RT-DETR-R18版本(GFLPOS也…...

网工基础 | 常见英文术语注解

原创:厦门微思网络 以下是一些网工专业常见的英文术语注解: IP Address(Internet Protocol Address) 互联网协议地址,是分配给连接到互联网的设备的唯一标识符,用于在网络中定位和通信。例如,“…...

[特殊字符] 各领域 Dummy 开关实现方式大集合

涵盖硬件、软件、工业控制、游戏开发及网络虚拟化场景: 🔌 1. 电子 / 硬件工程 🛠️ (1) 物理替代方案 🧲 跳线帽(Jumper)或短路块 👉 模拟开关“开/关”状态 ✅ 示例:开发板上的 B…...

AI低代码平台:开启高效智能开发新时代

科技飞速发展的当下,全球正加速迈向 AI 化。DeepSeek 等主流 AI 厂商的发展极大地改变了技术格局。众多企业为紧跟时代步伐,对高效开发工具的需求愈发迫切。百特搭AI低代码开发平台与 AI 技术的融合,为企业带来了开发高效化与智能化的全新解决…...

苍穹外卖2

根据id查询员工 调用顺序:Controller—>Service—>ServiceImpl—>Mapper—>xml 1.controller层一个tab秒了(ai生成) 由于result泛型中希望返回一个employee对象,所以定义一个employee来接受Service的getbyid方法,在…...

Redis 键(Key)详解

1. 键的基本概念 Redis 的键(key)是每条数据的唯一标识符。Redis 使用键来存取各种类型的数据结构,包括字符串、哈希、列表、集合、有序集合等。每个键都是唯一的,它决定了你访问哪条数据。 Redis 中所有读写操作都以键为基础&a…...

mac|使用scrcpy实现无线Android投屏

scrcpy是一个开源项目,从项目的releases可以得知它适用于windows、linux、mac github:https://github.com/Genymobile/scrcpy/releases github中提供了应用于mac系统的静态版本(也就是上图的scrcpy-macos-aarch64-v3.1.tar.gz和scrcpy-macos…...

【智驾中的大模型 -1】自动驾驶场景中的大模型

1. 前言 我们知道,大模型现在很火爆,尤其是 deepseek 风靡全球后,大模型毫无疑问成为为中国新质生产力的代表。百度创始人李彦宏也说:“2025 年可能会成为 AI 智能体爆发的元年”。 随着科技的飞速发展,大模型的影响…...

Python中的eval()函数详解

文章目录 Python中的eval()函数详解基本语法基本用法安全性问题安全使用建议实际应用场景与exec()的区别性能考虑总结 Python中的eval()函数详解 eval()是Python的一个内置函数,用于执行字符串形式的Python表达式并返回结果。它是一个强大但需要谨慎使用的函数。 …...

网络4 OSI7层

OSI七层模型:数据如何传送,向下传送变成了什么样子 应用层 和用户打交道,向用户提供服务。 例如:web服务、http协议、FTP协议 1.用户接口 2.提供各种服务 通过浏览器(接口)提供Web服务 表示层 翻译 我的“…...

数字世界的免疫系统:恶意流量检测如何守护网络安全

在2023年全球网络安全威胁报告中,某跨国电商平台每秒拦截的恶意请求峰值达到217万次,这个数字背后是无数黑客精心设计的自动化攻击脚本。恶意流量如同数字世界的埃博拉病毒,正在以指数级速度进化,传统安全防线频频失守。这场没有硝烟的战争中,恶意流量检测技术已成为守护网…...

在PyCharm中出现 **全角字符与非英文符号混合输入** 的问题

在PyCharm中出现 全角字符与非英文符号混合输入 的问题(如 124345dfs$¥cvd)&#xff0…...

我的计算机网络(总览篇)

总览--网络协议的角度 在一个庞大的网络中,该从哪里去了解呢?我先细细的讲一下我们访问一个网站的全部流程,当我们的电脑连上网络的时候,就会启动DHCP协议,来进行IP地址,MAC地址,DNS地址的分配…...

文件IO6(开机动画的显示原理/触摸屏的原理与应用)

开机动画的显示原理 ⦁ 基本原理 一般电子产品在开机之后都会加深用户印象,一般开机之后都会播放一段开机动画(视频、GIF…),不管哪种采用形式,内部原理都是相同,都是利用人类的眼睛的视觉暂留效应实现的…...

低代码开发能否取代后端?深度剖析与展望-优雅草卓伊凡

低代码开发能否取代后端?深度剖析与展望-优雅草卓伊凡 在科技迅猛发展的当下,软件开发领域新思潮与新技术不断涌现,引发行业内外热烈探讨。近日,笔者收到这样一个颇具争议的问题:“低代码开发能取代后端吗&#xff1f…...

反向代理断线重连优化

背景 1. 部分时候,反向代理因为路由重启,或者其他断网原因,等网络恢复后,无法对隧道重连。 2. 增加了心跳机制 在DEBUG调试过程中,发现禁用网卡后,在反向代理重连时候,服务器没有释放掉占用的…...

NLP中的“触发器”形式

在自然语言处理(NLP)中,触发器的设计更加依赖于文本特征,而非视觉特征。以下是NLP中常见的触发器类型及其实现方式: 1. 特定词汇或短语 定义:在文本中插入特定的单词、短语或符号。示例: 罕见…...

OJ 基础 | 输入处理

目录 一行输入一个整数: 一行输入2个整数 第一行有一个整数 m。接下来 m 行,每行两个整数 u,v : 一行输入一个整数: Nint(input()) #int类型 numinput() #字符串,一般用于需要去切片/遍历或者处理输入的数据 一行…...

array和list在sql中的foreach写法

在MyBatis中&#xff0c;<foreach>标签用于处理集合或数组类型的参数&#xff0c;以便在SQL语句中动态生成IN子句或其他需要遍历集合的场景。以下是array和list在SQL中的<foreach>写法总结。 <if test"taskIds ! null and taskIds.length > 0">…...

SDP(一)

SDP(Session Description Protocol)会话描述协议相关参数 Session Description Protocol Version (v): 0 --说明&#xff1a;SDP当前版本号 Owner/Creator, Session Id (o): - 20045 20045 IN IP4 192.168.0.0 --说明&#xff1a;发起者/创建者 会话ID&#xff0c;那么该I…...