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

例解什么是Python装饰器

Python中的装饰器一直是一个比较难理解的概念,我自己理解的就是用一个函数去修改另一个函数,主要是为另一个函数添加计时等功能,而且不用改变另一个函数,这样就大大减少了另一个函数的维护成本。

这个装饰器,英文名就是decorator,相关于把一个写好的程序添加一些新的功能,让这个程序变成多功能的。装饰器还可以传递参数,但如果要加参数就要多一层。

首先,我们看一个样例[1],有一个计算数字平方和的函数,我们添加一个装饰器elasped,来为它增加计算函数运行时间的功能。

一、不用@添加装饰器的写法

# 对目标函数进行elapsed装饰器函数的调用
# 返回一个装饰后的名字还是叫power_sum的函数
import time
def elapsed(target):"统计函数执行的耗时:"def decorated(*args,**kwargs):start = time.time()r = target(*args,**kwargs)end = time.time()print("函数执行耗时:", round(end - start, 2))return rreturn decorateddef power_sum(n):"计算并返回1到n之间每个数的平方的和"total = 0for i in range(1,n+1):total += i**2return total
if __name__ == "__main__":power_sum = elapsed(power_sum) # 相当于用装饰器函数elapsed调用了power_sum函数print(power_sum(1000000))

二、使用@加装饰器的调用方法

# 对目标函数进行elapsed装饰器函数的调用
# 返回一个装饰后的名字还是叫power_sum的函数
import time
def elapsed(target):"统计函数执行的耗时:"def decorated(*args,**kwargs):start = time.time()r = target(*args,**kwargs)end = time.time()print("函数执行耗时:", round(end - start, 2))return rreturn decorated@elapsed   # 相当于用装饰器函数elapsed调用了power_sum函数相当于这行代码:power_sum = elapsed(power_sum)
def power_sum(n):"计算并返回1到n之间每个数的平方的和"total = 0for i in range(1,n+1):total += i**2return total
if __name__ == "__main__":print(power_sum(1000000))

调用结果:

三、为装饰器加上参数的方法

现在为装饰器加上参数,把函数执行耗时的时间加上可以控制保留小数位数的参数precision,结果如下:

# 对目标函数进行elapsed装饰器函数的调用
# 返回一个装饰后的名字还是叫power_sum的函数
import time
def elapsed_precision(precision):def elapsed(target):"统计函数执行的耗时:"def decorated(*args,**kwargs):start = time.time()r = target(*args,**kwargs)end = time.time()print("函数执行耗时:", round(end - start, precision))return rreturn decoratedreturn elapsed#不写就没有装饰器效果,写了相当于这一句:power_sum = elapsed(power_sum) 也就是power_sum被装饰后又重新命名为power_sum函数
@elapsed_precision(3)# 这里的3就是装饰器的参数。
def power_sum(n):"计算并返回1到n之间每个数的平方的和"total = 0for i in range(1,n+1):total += i**2return total
if __name__ == "__main__":print(power_sum(10000000))

由上述代码可见,我们加装饰器后,原来的函数没有变化,我们只是通过装饰器给power_sum函数添加计时功能,传递了一个保留小数位数的参数precision。

四、学后反思

1. 装饰器是python学习中一个比较难理解的概念,因为我们一直把函数的参数局限为字符、列表、元组、字典这些常用的数据结构,但是如果我们把函数看成一个对象,把一个函数作为另一函数(装饰器)的参数来调用就好理解了。
2. 装饰器可以使Python编写的代码更容易维护,同时也可以为函数增加更多的功能,是Python程序编写过程中一个重要的工具。
3. 在我学习Python的过程中,我一直对装饰器、多线程、异步这些概念模糊不清楚。虽然也有意去学习,但很多时候是一知半解,后来通过B站学习和个人的思考慢慢把这些概念理解弄通。

相关文章:

例解什么是Python装饰器

Python中的装饰器一直是一个比较难理解的概念,我自己理解的就是用一个函数去修改另一个函数,主要是为另一个函数添加计时等功能,而且不用改变另一个函数,这样就大大减少了另一个函数的维护成本。 这个装饰器,英文名就…...

EtherCAT从站EEPROM组成信息详解(3):字16-63邮箱、EEPROM信息

0 工具准备 1.EtherCAT从站EEPROM数据(本文使用DE3E-556步进电机驱动器)1 字10-63邮箱、EEPROM信息 1.1 字10-63组成规范 字10-63虽然包含的空间区域很大,但实际上仅包含引导状态下邮箱配置、标准邮箱配置、EEPROM大小、执行的SII标准版本…...

【文件读取/包含】任意文件读取漏洞 afr_1

1.1漏洞描述 漏洞名称任意文件读取漏洞 afr_1漏洞类型文件读取漏洞等级⭐漏洞环境docker攻击方式 1.2漏洞等级 高危 1.3影响版本 暂无 1.4漏洞复现 1.4.1.基础环境 靶场docker工具BurpSuite 1.4.2.靶场搭建 1.创建docker-compose.yml文件 version: 3.2 services: web: …...

(八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB

​ 一、五种算法(DBO、LO、SWO、COA、GRO)简介 1、蜣螂优化算法DBO 蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为…...

通义灵码,阿里巴巴的编程辅助工具

一、官网 通义灵码_智能编码助手_AI编程_人工智能-阿里云 二、安装VSCode 如何下载安装VSCode 三、VSCode安装通义灵码 1.访问扩展详情界面 方式1 访问通义灵码安装教程页面 方法2 访问VSCode市场中的TONGYI Lingma 点击 Install 按钮访问扩展详情界面 2.打开VSCode …...

Uniapp导出的iOS应用上架详解

目录 Uniapp导出的iOS应用上架详解 摘要 引言 苹果审核标准 苹果调试 注意事项和建议 总结 摘要 本文将探讨Uniapp导出的iOS应用能否成功上架的问题。我们将从苹果审核标准、性能影响、调试流程等多个方面进行深入分析,以及向开发者提供相关注意事项和建议。…...

计算机视觉基础(7)——相机基础

前言 从这一节开始,我们来学习几何视觉。中层视觉包括相机模型、单目几何视觉、对极几何视觉和多目立体视觉等。在学习几何视觉最开始,我们先来学习一下相机模型,了解相机的基本原理,了解相机如何记录影像。 一、数字相机 1.1 基…...

解决Github上的README无法显示图片

首先感谢博主的思路:思路 最近写了点东西提交到git 发现本地能查看md里的图片用的相对路径,提交到github就看不见,并且发现不只是我自己的仓库看不见,其他人的我也看不见。那就有问题了 解决:正常使用相对路径&…...

qnx 工程目录创建工具 addvariant

文章目录 前言一、addvariant 是什么二、addvariant 使用实例1. variant names 参数说明2. 创建一个可执行文件工程3. 创建一个动态库工程 总结参考资料 前言 本文主要介绍如何在qnx 开发环境中创建工程目录及其相关的配置文件(common.mk, Makefile 文件等) 软件版本&#xff…...

计算机视觉+深度学习+机器学习+opencv+目标检测跟踪+一站式学习(代码+视频+PPT)

第1章:视觉项目资料介绍与学习指南 相关知识: 介绍计算机视觉、OpenCV库,以及课程的整体结构。学习概要: 了解课程的目标和学习路径,为后续章节做好准备。重要性: 提供学生对整个课程的整体认识&#xff0…...

【AI视野·今日CV 计算机视觉论文速览 第278期】Mon, 30 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Mon, 30 Oct 2023 Totally 50 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Image Clustering Conditioned on Text Criteria Authors Sehyun Kwon, Jaeseung Park, Minkyu Kim, Jaewoong Cho, Ernest…...

深度学习:多模态与跨模态

1 定义 1.1 多模态学习 多模态学习(Multimodal Learning)是一种利用来自多种不同感官或交互方式的数据进行学习的方法。在这个语境中,“模态”指的是不同类型的数据输入,如文本、图像、声音、视频等。多模态学习的关键在于整合和…...

大数据Hadoop之——部署hadoop+hive+Mysql环境(Linux)

目录 一、JDK的安装 1、安装jdk 2、配置Java环境变量 3、加载环境变量 4、进行校验 二、hadoop的集群搭建 1、hadoop的下载安装 2、配置文件设置 2.1. 配置 hadoop-env.sh 2.2. 配置 core-site.xml 2.3. 配置hdfs-site.xml 2.4. 配置 yarn-site.xml 2.5. 配置 ma…...

Python与ArcGIS系列(四)在地图文档中加入图层

目录 0 简述1 将图层添加到地图文档中2 将图层插入到地图文档0 简述 本篇介绍如何利用arcpy实现将图层添加到地图文档中,以及将图层插入到地图文档指定的位置。 1 将图层添加到地图文档中 arcpy的mapping模块提供的AddLayer()函数可以实现将图层添加到地图文档中。功能本质上…...

QT 程序异常崩溃

出现以下问题,大概率是你在修改代码时,在pro或者pri中增加了一些不存在的头文件或者cpp,使用BeyondCmp仔细对比,分享,希望帮助到你...

Ubuntu20.04 通过nmcli命令查看网卡状态为unmanaged

问题描述: 通过下述指令查看网卡状态为 "unmanaged" nmcli dev status 解决方法: cd /usr/lib/NetworkManager/conf.d/ sudo mv 10-globally-managed-devices.conf 10-globally-managed-devices.conf.bak sudo cp 10-globally-managed-devic…...

【R Error系列】r - fatal error : RcppEigen. h:没有这样的文件或目录

在头文件那要有 // [[Rcpp::depends(RcppEigen)]] 即&#xff1a; #include <Rcpp.h> #include <RcppEigen.h> using namespace Rcpp; using namespace Eigen;// [[Rcpp::depends(RcppEigen)]] // [[Rcpp::export]] 参考&#xff1a; r - fatal error: RcppEi…...

如何在聊天记录中实时查找大量的微信群二维码

10-5 如果你有需要从微信里收到的大量信息中实时找到别人发到群里的二维码&#xff0c;那本文非常适合你阅读&#xff0c;因为本文的教程&#xff0c;可以让你在海量的微信消息中&#xff0c;实时地把二维码自动挑出来&#xff0c;并且帮你分类保存。 如果你是做网推的&#…...

03-CSS基础选择器

3.1 CSS基础认知&#x1f34e; 3.1.1 &#x1f441;️‍&#x1f5e8;️CSS概念 CSS&#xff1a;层叠样式表&#xff08;Cascading style sheets)&#xff0c;为网页标签增加样式表现的 语法格式&#xff1a; 选择器{<!-- 属性设置 -->属性名:属性值; <!--每一个…...

【ROS】RViz2源码分析(二):main函数及编译配置详解

【ROS】郭老二博文之:ROS目录 1、main函数 #include <memory> #include <string> #include <vector>#include <QApplication>...

Vue.js的生命周期钩子

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...

第3章:搜索与图论【AcWing】

文章目录 图的概念图的概念图的分类有向图和无向图 连通性连通块重边和自环稠密图和稀疏图参考资料 图的存储方式邻接表代码 邻接矩阵 DFS全排列问题题目描述思路回溯标记剪枝代码时间复杂度 [N 皇后问题](https://www.luogu.com.cn/problem/P1219)题目描述全排列思路 O ( n ! …...

C++ Qt 学习(七):Qt 线程与并发

1. Qt 创建线程的三种方法 1.1 方式一&#xff1a;派生于 QThread 派生于 QThread&#xff0c;这是 Qt 创建线程最常用的方法&#xff0c;重写虚函数 void QThread::run()&#xff0c;在 run() 写具体的内容&#xff0c;外部通过 start 调用&#xff0c;即可执行线程体 run() …...

Django框架之模板层

【一】Django模板系统 官方文档&#xff1a;官方文档 【二】常用语法 只需要记两种特殊符号&#xff1a; {{ }}和 {% %} 变量相关的用{逻辑相关的用{%%}。 【三】变量 在Django的模板语言中按此语法使用&#xff1a; {{ 变量名 }}。 当模版引擎遇到一个变量&#xff0c;它…...

【AI视野·今日Robot 机器人论文速览 第六十五期】Mon, 30 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Mon, 30 Oct 2023 Totally 18 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Gen2Sim: Scaling up Robot Learning in Simulation with Generative Models Authors Pushkal Katara, Zhou Xian, Katerina F…...

LuatOS-SOC接口文档(air780E)--otp - OTP操作库

otp.read(zone, offset, len)# 读取指定OTP区域读取数据 参数 传入值类型 解释 int 区域, 通常为0/1/2/3, 与具体硬件相关 int 偏移量 int 读取长度, 单位字节, 必须是4的倍数, 不能超过4096字节 返回值 返回值类型 解释 string 成功返回字符串, 否则返回nil 例…...

为什么LDO一般不用在大电流场景?

首先了解一下LDO是什么&#xff1f; LDO&#xff08;low dropout regulator&#xff0c;低压差线性稳压器&#xff09;或者低压降稳压器&#xff0c;它的典型特性就是压降。 那么什么是压降&#xff1f; 压降电压 VDO 是指为实现正常稳压&#xff0c;输入电压 VIN 必须高出 所…...

Adobe家里的“3D“建模工 | Dimension

今天&#xff0c;我们来谈谈一款在Adobe系列中比肩C4D的高级3D软件的存在—— Dimension。 Adobe Dimension &#xff0c;其定位是一款与Photoshop以及Illustrator相搭配的3D绘图软件。 Adobe Dimensions与一般的3D绘图软件相较之下&#xff0c;在操作界面在功能上有点不大相同…...

MIB 6.1810实验Xv6 and Unix utilities(2)sleep

难度:easy Implement a user-level sleep program for xv6, along the lines of the UNIX sleep command. Your sleep should pause for a user-specified number of ticks. A tick is a notion of time defined by the xv6 kernel, namely the time between two interrupts f…...

修改 jar 包中的源码方式

在我们开发的过程中&#xff0c;我们有时候想要修改jar中的代码&#xff0c;方便我们调试或或者作为生产代码打包上线&#xff0c;但是在IDEA中&#xff0c;jar包中的文件都是read-only&#xff08;只读模式&#xff09;。那如何我们才能去修改jar包中的源码呢&#xff1f; 1.…...