Python函数装饰器的用法

Python函数装饰器的用法

文章目录

  • 1.装饰器的优点
  • 2. 使用装饰器前
  • 3. 使用装饰器后

装饰器是Python中一种强大的语法特性,它允许在不修改已有代码的情况下,对函数或类进行增强或修改。装饰器的本质是一个函数,它接受一个函数作为参数,并返回一个新的函数。


1.装饰器的优点

通过使用装饰器,我们可以在不改变原函数定义的情况下,在函数执行前后添加额外的功能。这样做具有以下几个优点:

  1. 代码复用:可以将一些通用的功能抽象出来,作为装饰器应用到多个函数上,避免了重复编写相同的代码。
  2. 解耦合:装饰器将原函数与额外的功能解耦合,使得每个函数只关注自己的核心逻辑,提高了代码的可读性和可维护性。
  3. 可扩展性:通过使用装饰器,我们可以方便地在已有函数上添加新的功能,而不需要修改原函数的定义,从而遵循了开放封闭原则。

下面我们以一个示例来说明装饰器的使用。


2. 使用装饰器前

假设我们有一个计算函数执行时间的需求,在使用装饰器前,可以这样实现:

import timedef my_function():# 记录开始时间start_time = time.time()# 模拟函数执行过程time.sleep(2)print("函数执行完毕")# 记录结束时间并计算执行时间end_time = time.time()print(f"函数的执行时间为:{end_time - start_time}秒")# 调用原函数
my_function()

输出结果:
            在这里插入图片描述


3. 使用装饰器后

此外,我们还可以使用装饰器来实现。

import time# 定义一个装饰器函数
def calculate_time(func):def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)end_time = time.time()print(f"函数 {func.__name__} 的执行时间为:{end_time - start_time}秒")return resultreturn wrapper# 原函数
@calculate_time
def my_function():# 模拟函数执行过程time.sleep(2)print("函数执行完毕")# 调用原函数
my_function()

输出结果:
            在这里插入图片描述


在上述代码中,将计算函数执行时间的功能定义为了装饰器函数calculate_time
它接受一个函数作为参数,并返回一个新的函数wrapper
wrapper函数实现了在原函数执行前后记录时间的功能。

通过在原函数my_function之前加上@calculate_time,我们将装饰器应用到了该函数上。当调用my_function时,实际上调用的是装饰后的函数wrapper,它会在执行原函数前后记录时间并打印出来。这样的写法也称装饰器的语法糖写法。

这样以来,原函数的功能和计算执行时间的功能被分离开,计算执行时间的函数被视为拓展功能。想要拓展其他功能只需继续新建其他装饰器函数进行拓展即可,而不必对原函数大动干戈。


通过对比使用装饰器前后的代码,我们可以看到使用装饰器后的代码更加简洁,而且将计算时间的逻辑与原函数分离开来,提高了代码的可读性和可维护性。此外,如果在其他函数中也需要统计执行时间,只需简单地加上装饰器即可,避免了重复编写相同的计时代码。这就是装饰器的优越性所在。

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

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

相关文章

软件测试面试最全八股文

请你说一说测试用例的边界 参考回答: 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类的边界。 常见的边界值 1)对16-bit 的整数而言 32…

故障排查:rpm安装报错事务锁定(can‘t create transaction lock on /var/lib/rpm/.rpm.lock)

博客主页:https://tomcat.blog.csdn.net 博主昵称:农民工老王 主要领域:Java、Linux、K8S 期待大家的关注💖点赞👍收藏⭐留言💬 目录 故障详情故障原因解决办法 故障详情 自己编写spec文件,制…

《C++ Primer》第10章 算法(二)

参考资料: 《C Primer》第5版《C Primer 习题集》第5版 10.4 再探迭代器(P357) 除了为每个容器定义的迭代器外,头文件 iterator 中还定义了额外的几种迭代器: 插入迭代器(insert iterator)&…

AMESim与MATLAB联合仿真demo

本文是AMESim与MATLAB联合仿真的demo,记录一下如何进行联合仿真。 AMESim与MATLAB联合仿真可以大幅度提高工作效率。 author:xiao黄 缓慢而坚定的生长 csdn:https://blog.csdn.net/Python_Matlab?typeblog主页传送门 博主的联合仿真环境如下&#xff…

数字图像处理(实践篇)十五 基于傅里叶变换的高通滤波和低通滤波

目录 一 Numpy 实现傅里叶变换 1 涉及的函数 2 实践 二 OpenCV 实现傅里叶变换 1 涉及的函数 2 实践 为了有效地和快速地对图像进行处理和分析,常常需要将原定义在图像空间的图像以某种形式转换(正变换)到另外一些空间,并利…

物业报修管理系统

物业报修管理系统是一种能够提高物业管理效率和服务质量的软件,它可以帮助物业公司和业主之间实现快速、方便、高效的报修沟通和处理。 但是很多物业公司还在使用传统的报修方式,比如电话、纸质表格、微信群等,这些方式存在很多问题&#xff…

Linux系统编程:进程总结

这一章主要为进程的基本内容作一个总结,为后面的多进程多线程并发作一个铺垫。 进程标识符pid pid类型为 pid_t。 在涉及有关进程相关内容的时候,一定要熟悉 ps 命令的使用,该命令专门用来打印当前系统的进程信息: 这里经常使用…

【Python数据结构与算法】--- 递归算法的应用 ---[乌龟走迷宫] |人工智能|探索扫地机器人工作原理

🌈个人主页: Aileen_0v0 🔥系列专栏:PYTHON数据结构与算法学习系列专栏💫"没有罗马,那就自己创造罗马~" 目录 导言 解决过程 1.建立数据结构 2.探索迷宫: 算法思路 递归调用的“基本结束条件” 3.乌龟走迷宫的实现代码: …

【MATLAB源码-第92期】基于simulink的QPSK调制解调仿真,采用相干解调对比原始信号和解调信号。

操作环境: MATLAB 2022a 1、算法描述 QPSK,有时也称作四位元PSK、四相位PSK、4-PSK,在坐标图上看是圆上四个对称的点。通过四个相位,QPSK可以编码2位元符号。图中采用格雷码来达到最小位元错误率(BER) —…

Electronica慕尼黑电子展 Samtec团队与21ic分享虎家产品与方案

【摘要/前言】 “希望但凡是能够使用到连接器的场合都有Samtec的身影” 在慕尼黑上海电子展现场,Samtec华东区销售经理章桢彦先生在与21ic副主编刘岩轩老师的采访中,如是说道。这是一种愿景,更是Samtec的努力方向。短短一句话,…

​[Oracle]编写程序,键盘输入n,计算1+前n项之和。测试案例:输入:10 输出:22.47​

编写程序,键盘输入n,计算1前n项之和。 测试案例: 输入:10 输出:22.47 代码如下: set serveroutput on declare v_sum number:0;v_n number;beginv_n:&n;for i in 1..v_n loopv_sum:v_sumsqrt(i); end loop; d…

1+X网络系统建设与运维练习题

1.OSPF的最优路由,会放到IP路由表中指导数据转发 (x) 2.当AP工作在2.4GHz频段的时候,AP工作的频率范围是2.4GHz~2.4835GHZ。在此频率范围内又划分出14个信道。每信道的中心频率相隔5MHz,每个信道可供占用的带宽为22MHz…