news 2026/7/6 13:52:11

Python 修饰器竟能给函数开挂,额外功能随意加

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 修饰器竟能给函数开挂,额外功能随意加

修饰器的概念和作用 什么是修饰器

装饰器, 也被称作修饰器, 其本身属于一个函数, 能够给原先既有的函数或者方法上面添加某些额外的功能。

修饰器的作用

概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

比如说, 这个函数具备注册的特性, 但有时, 当这个用户开展这个行动时, 他属于已注册的用户, 而我所写的这个函数已完成, 不想对其进行改动了, 那么, 我们能够借助修饰器为这个函数增添一个登录的功能。

它常常被运用于存在切面需求的情景之中, 像是: 插入日志的情景, 性能被测试的情景, 针对事务进行处理的情景, 缓存相关的情景, 权限校验相关的情景等等。装饰器乃是解决这类问题的极为出色的设计, 有了装饰器, 我们便能够从中抽离出数量众多的、同函数功能其自身并无关联的雷同代码, 并且还能持续进行重用。从需求开始说起。

引入

现在,假设我们有一个函数

def foo(): print('in foo()') foo()

有这样的情况, 就是为了对这个函数的复杂度进行检查, 而在网络编程里程序的延时是相当要紧的, 所以需要去测算运算时间, 于是增加了计算时间的功能, 进而有了下面这样的代码:。

import time def foo(): start = time.clock() print('in foo()') end = time.clock() print('in foo()') foo()

这儿仅仅写了个函数, 要是想测定好几个函数的延迟, 鉴于必定要晓得start跟end, 因而势必得写在程序起始与末尾, 但难道每个程序都这般复制粘贴吗? 虽说可行, 然而借助设计模式把功能以及数据部分拆分, 类似操作中再把这测量时长的函数分离出去, 就如同C++里能把这测量时长的函数转成类那种情况一样, 通过调用此类别, 赋予不一样的函数去度量不同函数的执行耗时。在中,由于函数实际上就是对象,所以可以利用类似的方法实现:

import time def foo(): print('in foo()') def timeit(func): start = time.clock() func() end =time.clock() print('Time Elapsed:', end - start) timeit(foo)

在这里函数func()能够被用来指定函数, 话虽如此, 要是我不打算填这个函数, 并且这个功能函数没办法被修改成类似的形式, 这种情况下要怎么处理呢? 我们所需要的是怎样做到最大限度地减少改动:。

import time def foo(): print('in foo()') # 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法 def timeit(func): # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装 def wrapper(): start = time.clock() func() end =time.clock() print('Time Elapsed:', end - start) # 将包装后的函数返回 return wrapper foo = timeit(foo) #可以直接写成@timeit + foo定义,python的"语法糖" foo()

在这个代码里, (foo)并非直接产生调用的效果, 而是返回一个跟foo参数列表相同的函数(实际上是函数回调), 此时此地这个foo跟之前的foo不一样!因为这时的foo有了这样的功效, 简言之就是能使你在装饰前后执行代码, 而不用去改变函数自身的内容, 装饰器是一个函数, 并且它的参数是另一个函数。

修饰器本质

针对于这个, 被称作@注解语法糖之 - Sugar而言, 在你凭借某个@用以修饰某个函数func之际, 情形如下所展现的:

@decorator def func(): pass

其解释器会解释成下面这样的语句:

func = decorator(func)

等等, 难道这不是将一个函数当作参数传入到另一个函数里, 随后再进行回调吗? 没错, 然而, 我们得留意, 这里还存在一个赋值语句, 它把这个函数的返回值又赋值回原来的 func 这个呢!按照《函数式编程》当中 first class 的定义来说, 你能够把函数用作变量一样发挥作用, 所以, 必须返回一个函数给 func 才行, 这就是所谓的 order 高阶函数了, 要不然, 后续在调用 func() 时就会出现错误。

注意 个人总结

实际上, 修饰器跟一个函数比较相像, 然而修饰器会把被修饰的函数当作形参看待, 首先去执行修饰器里面的语句, 接着返回传递进来的函数对象(别的函数对象也可以), 随后调用返回出来的那个函数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 13:51:38

第9篇|导航返回乱跳:用 NavPathStack 把返回路径收口

第9篇|导航返回乱跳:用 NavPathStack 把返回路径收口 摘要:实际项目里,导航最怕的不是“跳不过去”,而是“跳过去以后回不来”。首页、详情页、编辑页、登录页、通知入口混在一起后,如果每个按钮都自己决定…

作者头像 李华
网站建设 2026/7/6 13:51:16

华为MetaERP 确保 Oracle EBS AR 应收业务蓝图文档准确、完整的全流程管控方案一、前置基线校验:从产品标准逻辑杜绝底层错误(保证准确性根基)1. 对标 EBS 官方产品标准,避免

确保 Oracle EBS AR 应收业务蓝图文档准确、完整的全流程管控方案一、前置基线校验:从产品标准逻辑杜绝底层错误(保证准确性根基)1. 对标 EBS 官方产品标准,避免功能描述偏差核对 Oracle 官方文档 以 Oracle EBS R12 AR Implement…

作者头像 李华
网站建设 2026/7/6 13:50:27

JDK系列13:记录类Record、密封类Sealed Class,规范化数据载体

文章目录一、前言:传统Java建模的两大痛点1.1 数据载体极度冗余1.2 类继承完全失控二、Record 记录类:极简不可变数据载体2.1 核心设计思想2.2 传统POJO VS Record 对比传统Java POJO(冗余版)Record 极简写法2.3 Record 底层编译机…

作者头像 李华
网站建设 2026/7/6 13:49:29

音视频上层架构

音视频「数据本质」的绝妙镜像 🎯 音视频底层世界终极对照表(Final Edition) 维度 (Dimension)音频世界 (Audio World)视频世界 (Video World)内核驱动子系统ALSA (/dev/snd/pcm*) 字符设备,应用层通过 mmap 或 read/write 拉取…

作者头像 李华
网站建设 2026/7/6 13:49:26

科研绘图轻量化新解法:paperxie 一站式 AI 制图,适配全学科论文配图需求

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/科研绘图 科研绘图 - PaperXie智能写作PaperXie免费论文查重检测-首款免费论文检测软件,为毕业生提供专业的论文重复率检测、论文降重、Aigc检测、智能排版 、论文写作等一站式服务。https://www.paperxie…

作者头像 李华
网站建设 2026/7/6 13:48:00

Python 7+ @装饰器:优雅编程新体验

一、学前花絮学习深入后, 我们知晓, 因全世界社区贡献, 不断增添新功能、新模块, 使其在各个领域展现出独特风采, 过程层层递进, 原因相互关联, 结果显著突出。先比如说在我们学习类class之时, 第一步要做些什么呢, 要去写()方法, 以此来初始化类以及实例变量, 而这些变量是意在…

作者头像 李华