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"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/77616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git commit时自动生成Change-ID

创建全局钩子目录: 创建一个全局的Git hooks目录: mkdir -p ~/.githooks 下载并设置commit-msg钩子脚本: 下载Gerrit的commit-msg钩子脚本,并放置在全局钩子目录中(如下载不了,可从本页面附件中下载,“…

最新Ktransformers v0.24(Docker)并发部署DeepSeek-V3-0324模型

一、介绍 KTransformers v0.2.4 发布说明 我们非常高兴地宣布,期待已久的 KTransformers v0.2.4 现已正式发布!在这个版本中,我们对整 体架构进行了重大重构,更新了超过 1 万行代码,为社区带来了备受期待的多并发支…

飞牛私有云5大硬核功能实测!

📸 1. 智能相册:AI搜图原图自由 - 自动备份:手机照片/视频实时同步,支持RAW格式、实况照片无损备份,释放128G手机秒变256G。 - AI黑科技: - 人脸识别:自动归类人物相册,输入「妈妈…

webrtc pacer模块(一) 平滑处理的实现

Pacer起到平滑码率的作用,使发送到网络上的码率稳定。如下的这张创建Pacer的流程图,其中PacerSender就是Pacer,其中PacerSender就是Pacer。这篇文章介绍它的核心子类PacingController及Periodic模式下平滑处理的基本流程。平滑处理流程中还有…

【android bluetooth 协议分析 01】【HCI 层介绍 1】【hci_packets.pdl 介绍】

在 AOSP 的蓝牙协议栈 (Gabeldorsche) 中,hci_packets.pdl 是一个 协议描述语言文件,用于定义 HCI (Host Controller Interface) 层的数据包结构和通信协议。以下是详细解析: 1. 文件作用 system/gd/hci/hci_packets.pdl 协议自动化生成&…

操作系统 4.2-键盘

键盘中断初始化和处理 提取的代码如下: // con_init 函数,初始化控制台(包括键盘)的中断 void con_init(void) {set_trap_gate(0x21, &keyboard_interrupt); } ​ // 键盘中断处理函数 .globl _keyboard_interrupt _keyboard…

深入理解Softmax函数及其在PyTorch中的实现

Softmax函数简介 Softmax函数在机器学习和深度学习中,被广泛用于多分类问题的输出层。它将一个实数向量转换为概率分布,使得每个元素介于0和1之间,且所有元素之和为1。 Softmax函数的定义 给定一个长度为 K K K的输入向量 z [ z 1 , z 2 …

Vue 3 响应式更新问题解析

在 Vue 3 中,即使使用 reactive 或 ref 创建的响应式数据,当数据量很大时也可能出现更新不及时的情况。以下是原因和解决方案: 核心原因 ​​响应式系统优化机制​​: Vue 3 使用 Proxy 实现响应式,比 Vue 2 更高效但为…

异形遮罩之QML中的 `OpacityMask` 实战

文章目录 🌧️ 传统实现的问题👉 效果图 🌈 使用 OpacityMask 的理想方案👉代码如下🎯 最终效果: ✨ 延伸应用🧠 总结 在 UI 设计中,经常希望实现一些“异形区域”拥有统一透明度或颜…

数据可视化 —— 堆形图应用(大全)

一、案例一:温度堆积图 # 导入 matplotlib 库中的 pyplot 模块,这个模块提供了类似于 MATLAB 的绘图接口, # 方便我们创建各种类型的可视化图表,比如折线图、柱状图、散点图等 import matplotlib.pyplot as plt # 导入 numpy 库&…

python工程中的包管理(requirements.txt)

pip install -r requirements.txtpython工程通过requirements.txt来管理依赖库版本,上述命令,可以一把安装依赖库,类似java中maven的pom.xml文件。 参考 [](

操作系统 3.4-段页结合的实际内存管理

段与页结合的初步思路 虚拟内存的引入: 为了结合段和页的优势,操作系统引入了虚拟内存的概念。虚拟内存是一段地址空间,它映射到物理内存上,但对用户程序是透明的。 段到虚拟内存的映射: 用户程序中的段首先映射到虚…

【Amazon EC2】为何基于浏览器的EC2 Instance Connect 客户端连接不上EC2实例

文章目录 前言📖一、报错先知❌二、问题复现😯三、解决办法🎲四、验证结果👍五、参考链接🔗 前言📖 这篇文章将讲述我在 Amazon EC2 上使用 RHEL9 AMI 时无法连接到 EC2 实例时所遇到的麻烦😖 …

Python学习笔记(二)(字符串)

文章目录 编写简单的程序一、标识符 (Identifiers)及关键字命名规则:命名惯例:关键字 二、变量与赋值 (Variables & Assignment)变量定义:多重赋值:变量交换:(很方便哟) 三、输入与输出 (In…

Hydra Columnar:一个开源的PostgreSQL列式存储引擎

Hydra Columnar 是一个 PostgreSQL 列式存储插件,专为分析型(OLAP)工作负载设计,旨在提升大规模分析查询和批量更新的效率。 Hydra Columnar 以扩展插件的方式提供,主要特点包括: 采用列式存储&#xff0c…

es的告警信息

Elasticsearch(ES)是一个开源的分布式搜索和分析引擎,在运行过程中可能会产生多种告警信息,以提示用户系统中存在的潜在问题或异常情况。以下是一些常见的 ES 告警信息及其含义和处理方法: 集群健康状态告警 信息示例…

健康与好身体笔记

文章目录 保证睡眠饭后百步走,活到九十九补充钙质一副好肠胃肚子咕咕叫 健康和工作的取舍 以前对健康没概念,但是随着年龄增长,健康问题凸显出来。 持续维护该文档,健康是个永恒的话题。 保证睡眠 一是心态要好,沾枕…

vue实现在线进制转换

vue实现在线进制转换 主要功能包括: 1.支持2-36进制之间的转换。 2.支持整数和浮点数的转换。 3.输入验证(虽然可能存在不严格的情况)。 4.错误提示。 5.结果展示,包括大写字母。 6.用户友好的界面,包括下拉菜单、输…

智体知识库:poplang编程语言是什么?

问:poplang语言是什么 Poplang 语言简介 Poplang(OPCode-Oriented Programming Language)是一种面向操作码(Opcode)的轻量级编程语言,主要用于智体(Agent)系统中的自动化任务处理、…

二分查找5:852. 山脉数组的峰顶索引

链接:852. 山脉数组的峰顶索引 - 力扣(LeetCode) 题解: 事实证明,二分查找不局限于有序数组,非有序的数组也同样适用 二分查找主要思想在于二段性,即将数组分为两段。本体就可以将数组分为ar…