【python进阶篇】装饰器(6)

在Python中,修饰器(也称为装饰器)是一个高级Python功能,它允许你修改或增强函数、方法或类的行为,而无需修改其源代码。修饰器本质上是一个接受函数作为参数的可调用对象(通常是另一个函数),并返回一个新的函数对象。

一般想要给源代码增添功能,需要修改其源代码:

import timedef Demo():print('hello')time.sleep(1)print('python')

上面为原始代码,如果想要给其增添新的功能,如计算代码执行时间,常规操作为:

import timedef Demo():start_time = time.time()print('hello')time.sleep(1)print('python')end_time = time.time()result = end_time - start_timeprint('程序执行时间为:%s秒'%result)

那么,如果在不修改源代码的情况下,给其增添新的功能,就需要用到我们装饰器了:

import timedef Demo(func):def demo1():start_time = time.time()func()end_time = time.time()result = end_time - start_timeprint('程序执行时间为:%s秒'%result)return demo1@Demo
def time_operation():print("hello")time.sleep(1)print("python")if __name__ == '__main__':a = time_operationa()print("a.__name__ is:%s\n" % a.__name__)

控制台输出:

说明:

在这个例子中,Demo是一个修饰器函数,它接受一个函数 func 作为参数,,并返回一个新的函数 demo1。通过使用@Demo语法,我们将 Demo应用到 time_operation上,从而在不修改 time_operation 源代码的情况下增强了其行为。

当调用 time_operation() 时,实际上调用的是修饰器返回的 demo1函数,因此会打印出执行时间。

到这里我们可能会想到,在项目中如果我们多使用几个装饰器可行嘛,答案是当然可以,我们一起往下来看看:

import timedef Demo(func):print("ddddd")  def demo1():start_time = time.time()func()end_time = time.time()result = end_time - start_timeprint('程序执行时间为:%s秒'%result)return demo1def dec2(func):  print("aaaa")  def two():  print("bbbb")  func()  print("cccc")  return two @dec2
@Demo
def time_operation():print("hello")time.sleep(1)print("python")if __name__ == '__main__':a = time_operationa()

控制台输出:

说明:

多个装饰器执行的顺序就是从最后一个装饰器开始,执行到第一个装饰器,再执行函数本身。这表明 Demo首先被应用,然后是 dec2

总结:

python装饰器在日志记录、性能分析、缓存结果、函数增强等方面应用广泛~

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Spring-IOC之组件扫描

版本 Spring Framework 6.0.9​ 1. 前言 通过自动扫描,Spring 会自动从扫描指定的包及其子包下的所有类,并根据类上的特定注解将该类装配到容器中,而无需在 XML 配置文件或 Java 配置类中逐一声明每一个 Bean。 支持的注解 Spring 支持一系…

编程基础“四大件”

基础四大件包括:数据结构和算法,计算机网络,操作系统,设计模式 这跟学什么编程语言,后续从事什么编程方向均无关,只要做编程开发,这四个计算机基础就无法避开。可以这么说,这基础四大件真的比编程语言重要!&#xff0…

(一)、SQL进阶——神奇的SQL

一、CASE表达式 1、CASE表达式概述 case表达式有简单case表达式和搜索case表达式两种写法 -- 简单case表达式 case sex when 1 then 男 when 0 then 女 else 其他 end -- 搜索case表达式 case when sex1 then 男 when sex1 then 男 else 其他 end 这两种写法执行的结…

操作系统原理与实验——实验九分页式存储

实验指南 运行环境: Dev c 算法思想: 本实验模拟分页存储管理,对于需要分配资源的作业,预先申请空间,内存空间满足要求,进行内存分配并插入作业链表,打印该作业页表信息与系统内存信息。对于需要…

【QT学习】9.绘图,三种贴图,贴图的转换

一。绘图的解释 Qt 中提供了强大的 2D 绘图系统,可以使用相同的 API 在屏幕和绘图设备上进行绘制,它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。 QPainter 用于执行绘图操作,其提供的 API 在 GUI 或 QImage、QOpenGLPaintDev…

路由引入实验

配置思路: 1.IP配置: [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip ad 100.1.1.1 24 [R1-GigabitEthernet0/0/0]int l0 [R1-LoopBack0]ip ad 192.168.0.1 32 [R1-LoopBack0]int l1 [R1-LoopBack1]ip ad 192.168.1.1 32 [R1-LoopBack1]q dis ip int bri…

海康Visionmaster-常见问题排查方法-启动阶段

VM试用版启动时,弹窗报错:加密狗未安装或检测异常;  问题原因:安装VM 的时候未选择软加密,选择了加密狗驱动,此时要使用软授权就出现了此现象。  解决方法: ① 首先确认软加密驱动正确安装…

XYCTF 部分wp及学习记录

1.ezmd5 根据题目提示 我们知道应该是要上传两张md5值相同的图片 根据原文链接:cryptanalysis - Are there two known strings which have the same MD5 hash value? - Cryptography Stack Exchange 把保存下来的图片上传一下 得到flag 2.ezhttp 根据原文链接&…

OpenStack云计算(十一)——OpenStack网络管理,验证OpenStack网络资源模型,验证来巩固和加深对OpenStack网络资源模型的理解

项目实训一 【实训题目】 验证OpenStack网络资源模型 【实训目的】 通过验证来巩固和加深对OpenStack网络资源模型的理解。 【实训准备】 (1)复习Neutron网络资源模型。 (2)重点理解网络、子网、端口和路由器的概念。 【实…

SOTAX溶出测试系统PC触摸屏维修三部曲

SOTAX溶出测试系统作为一款广泛应用于制药行业的知名品牌,具有高精度、操作简便、稳定性好等特点。它适用于各种类型的药品研发和生产环节,为科研人员提供可靠的数据支持。瑞士SOTAX溶出仪是实验室中常用的设备,其触摸屏是用户交互的重要界面…

【java毕业设计】 基于Spring Boot+mysql的免税商品优选购物商城设计与实现(程序源码)-免税商品优选购物商城

基于Spring Bootmysql的免税商品优选购物商城设计与实现(程序源码毕业论文) 大家好,今天给大家介绍基于Spring Bootmysql的免税商品优选购物商城设计与实现,本论文只截取部分文章重点,文章末尾附有本毕业设计完整源码及…

Mysql学习一

目录 1.启动数据库: 2.命令行连接到MySQL(winr输入cmd) 3.MySQL的三重结构: 4.SQL语句分类: 1.启动数据库: winr——输入services.msc进入本地服务 2.命令行连接到MySQL(winr输入cmd&#x…

数据结构-树和森林之间的转化

从树的二叉链表的定义可知,任何一棵和树对应的二叉树,其根节点的右子树必为空。这里我们举三个树,将这个由三个树组成的森林组成二叉树是这个样子的。 下面我们说明一下详细过程,首先将每个树转化为二叉的状态,如图所示…

[激光原理与应用-89]:激光器产品性能指标参数详解

目录 示例:大量能纳秒激光器 示例2:中等能量纳秒激光器 1、中心波长Wavelength (nm) 351nm1nm 2、脉冲宽度 Pulse Width ~120ns 1kHz 3、重复频率 Repitition Rate 1~10KHz 4、行频 Line Frequency 50 to 60 Hz 5、单脉冲能量 Pulse …

逆向修改app就可以游戏充值到账?

hello ,大家好, 现在市场仍然流行着非常多的传奇类游戏私服或者其他类型的游戏私服,随着私服越来越多(很多并不合法),越来越多的人加入了破解,逆向修改,或者代充的队伍并从中获利。这里我给大家分享一下这些做代充的常规的做法,以及大家作为游戏服务器如何避坑做强校验…

在linux系统中启动pycharm

1.找到pycharm的安装路径,一般在下载文件夹中 2.进入pycharm的安装路径,进入bin目录 3.右击,打开终端,输入./pycharm.sh

数字化工厂生产管理系统提升企业竞争力

在当今激烈竞争的市场环境中,企业面临着诸多挑战,如不断增加的客户需求、日益严格的质量标准以及快速变化的市场趋势。为了在这样的环境中保持竞争力,许多企业正在转向数字化工厂生产管理系统。 数字化工厂生产管理系统是一种集成的软件解决方…

云盘怎么选最好!

选择云盘时,您应该考虑以下几个关键因素来确保选中最适合您需求的服务: 速度:选择云盘时,传输速度是一个重要的考量点。您应该选择一个即使不使用会员服务也能提供较快上传和下载速度的云盘服务。 存储空间:不同的云盘…

Kubernetes(k8s)的概念以及使用

k8s的概念: K8s是指Kubernetes,是一个开源的容器编排和管理平台。它最初由Google开发,并于2014年将其开源。Kubernetes旨在简化容器化应用程序的部署、扩展和管理。 Kubernetes提供了一种可靠且可扩展的平台,用于管理容器化应用…

Jmeter(十二) - 从入门到精通 - JMeter逻辑控制器 - 终篇(详解教程)

宏哥微信粉丝群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 Jmeter官网对逻辑控制器的解释是:“Logic Controllers determine the order in which Samplers are processed.”。 意思是说,逻辑控制器可以控制采样…