python语法——@装饰器详解

Python装饰器@语法糖详解与应用实践 装饰器是Python中实现高阶函数的重要特性,通过@语法糖提供简洁的语法结构。其本质是接受函数作为参数并返回函数的高阶函数,常用于实现日志记录、性能监控、权限校验等横切关注点。在Web开发框架如Flask中,装饰器被广泛应用于路由注册;在测试框架如Pytest中则用于定义测试夹具。理解装饰器的工作原理(如functools.wraps保持元信息、*args/**kwargs处理参数)能帮助开发者实现更优雅的AOP编程。本文通过实际案例展示如何开发带参数的装饰器、类装饰器以及异步装饰器,并分析在Django、 阅读详情

python的装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数。
装饰器用到了闭包原理,目的是为了简化代码,用@来表示。

不带参数的装饰器

我们从一个最简单的装饰器例子说起:

def add_one(f):
    def fun(*args):
        a = args[0]
        f(a + 1)
    return fun

@add_one
def print_self(a):
    print("a =", a)

print_self(1)

程序运行的结果为:

a = 2

为什么参数明明是1,却输出2呢?

关键就在于,因为有了装饰器 @add_one 的作用,print_self 已经不再是原来的 print_self 了。

程序运行时,真正的步骤是:
1、在运行到 print_self(1) 时,先将 print_self 这个函数本身作为参数,传入 add_one 中。
2、然后会返回一个函数 fun,相当于将 print_self 装饰成了 fun。
3、然后将参数 1 传给 fun,于是 args=(1,),然后有 f(a+1),此时 f 即为 print_self,因此执行的是 print_self(a+1) 即 print_self(2)。

这个装饰器,和下面的代码是等效的:

#@add_one
def print_self(a):
    print("a =", a)

print_self = add_one(print_self)
print_self(1)

其中,将装饰器@注释掉、且增加了一句手动调用add_one的语句,结果等效。

简化

如果被装饰函数没有参数,则可以将装饰器由闭包改为一个普通的函数,但是也一定要返回一个可调用函数:

def add_one(f):
    print('excute add_one')
    return f

@add_one
def print_self():
    print("excute print_self")

print_self()

结果:

excute add_one
excute print_self

这种形式可以用于记录调用函数的日志。

带参数的装饰器

上面的例子中,@add_one 后面是没有参数的,但是 add_one 函数本身是有一个参数 f 的,装饰器会自动将所装饰的函数 print_self 传给参数 f。但是有的装饰器是如同 @decorator(a, b) 这样的形式,后面跟着参数,原理又是如何?
这时候,decorator(a, b) 其实不应该当做一个装饰器,而是一个固定的函数值,我们需要计算出 decorator(a, b),比如其返回一个函数 return_fun,那么这个返回的函数才是真正的装饰器,相当于 @retturn_fun。

记住:@后面跟的永远是一个可调用的函数,而不是一个固定的函数值,如果是一个固定的函数值,那么这个函数值本身,肯定是一个可调用的函数。

举例说明:
改造上面的 add_one 装饰器,我希望add的值不是固定为1,而是可以人为设置的,那么可以将这个加数放到装饰器中,如:

def add_number(num):
    def fun(f):
        def _fun(*args):
            f(args[0] + num)
        return _fun
    return fun

@add_number(2)
def print_b(b):
    print('b =', b)

print_b(1)

运行结果为:

b = 3

运行原理:
1、执行 print_b(1) 时,发现被 @add_number(2) 装饰。
2、计算 add_number(2) ,返回 fun(此时里面的num已经固定为2)。
3、将 print_b 当做参数 f 传给 fun,返回 _fun。
4、将参数 1 当做参数 *args 传给 _fun,执行 f(1 + 2)。
5、输出 b = 3。

简化

如果被装饰函数没有参数,则可以将装饰器由三层改为两层,但是内层函数一定要返回一个可调用函数,如:

def add_number(num):
    def fun(f):
        print('num =', num)
        return f
    return fun

@add_number(2)
def print_hello():
    print('hello')

print_hello()

结果:

num = 2
hello
1.为什么要学习MATLAB 学习MATLAB 阅读详情

相关推荐

MATLAB功率谱函数psd与pwelch的使用

在网上看到 clear; Fs=1000; n=0:1/Fs:1; y=cos(2*pi*40*n)+3*cos(2*pi*100*n)+randn(size(n)); Nfft=1000; window=hanning(100); noverlap=20; dflag='none'; [Pxx,f]=psd(y,Nfft,Fs,window,noverlap); figure plot(f,10*log10(Pxx)); xlabel('frequency/Hz');ylab

qq_41687938的博客 2万+

Python @函数装饰器及用法(超级详细)

Python 内置的 3 种函数装饰器,分别是@staticmethod、@classmethod 和 @property,其中 staticmethod()、classmethod() 和 property() 都是 Python 的内置函数。

Itmastergo的博客 906

树莓派4在Bookworm Raspbian系统下无法进入桌面模式(启动后出现彩色画面,然后一直黑屏,但是可以正常启动和ssh)

本文记录了这段比较坎坷的探索之路,由于你的问题不一定是我最终解决方案的,可能是前面探索路上试过的,所以建议按顺序看排除前置问题。 双十一又买了个树莓派 4B,插上之前树莓派 4B 的 TF 卡直接就能使用(毕竟是一样规格的)。但是由于用来连接硬盘的 USB 线是坏的,我以为是系统问题就进行了重装(所以坏掉的线还是直接扔了好)。 重新安装系统就装了最新的 2023-10-10 版本的 64 位的 Raspberry Pi OS,但是出现了一个问题: 启动后出现彩色画面,然后一直黑屏。

ZhongUncle的博客 3735

Python装饰器@语法详解

简单来说,装饰器就像一个“包装盒”或“增强插件”,它接收一个函数(或类)作为输入,然后返回一个新的、功能增强了的函数(或类)。它是一个非常强大且常用的语法特性,允许您在不修改原函数或类代码的情况下,为其添加额外的功能。这样修改的缺点是:如果多个函数都需要计时,就要重复写很多遍计时代码,且污染了原函数的纯粹性。装饰器不仅可以装饰函数,也可以装饰类。其原理是将类作为参数,返回一个修改过的或全新的类。函数,可以保留原函数的元信息(如名字、文档字符串),这对于调试非常有用。在编写自己的装饰器时,用它来装饰内部的。

qq_43107935的博客 653

5款免费二进制编辑器横向评测:从HxD到ImHex谁更适合你?

本文对5款免费二进制编辑软件进行深度横向评测,包括HxD、wxHexEditor、010 Editor、ImHex和GNU Emacs,涵盖从轻量级到专业级的各种需求。评测基于文件处理能力、编辑功能、分析工具等核心维度,为开发者、逆向工程师和安全研究人员提供实用选择指南,帮助用户根据具体场景选择最适合的二进制编辑工具。

weixin_29278805的博客 372

TK抓包协议分析:So层逆向

第三个参数是一个回调函数,这里他的返回值1表示成功,0表示失败,那我们手动把他Hook为0,让他不支持quic协议,实现降级。等,我们是为了解决抓包问题,那很有可能是在net目录下(network),那来搜索一下。开了抓包以后APP直接是网络无连接了,并且抓到的请求也是不正常的,下面我们就开始定位。看了半天感觉也没啥有用的东西,那下面我们整理一下已经有信息,来猜测一下,后续怎么进行。那可以猜测,我们真正需要Hook的那个函数也有可能是这样加载的,可以字符串搜索一下。

2503_90751938的博客 3421

Python教程(24)——全方位解析Python中的装饰器

Python装饰器是一种特殊的函数,它接收一个函数作为参数,然后返回一个新的函数,用于扩展或修改原始函数的行为。装饰器提供了一种便捷的方式来在不修改被装饰函数源代码的情况下,增加、修改或包装函数的功能。通俗点说就是尽量不修改原有功能代码的情况下,给原有的功能添加新的功能。装饰器的基本语法是使用符号将装饰器函数应用于目标函数。在这里,decorator是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数。是目标函数,即需要被装饰的函数。

一点 1198

【自然语言处理】情感分析(一):基于 NLTK 的 Naive Bayes 实现

朴素贝叶斯(Naive Bayes)分类器可以用来确定输入文本属于某一组类别的概率。例如,预测评论是正面的还是负面的。它是 “朴素的”,它假设文本中的单词是独立的(但在现实的自然人类语言中,单词的顺序传达了上下文信息)。尽管有这些假设,但朴素贝叶斯在使用少量训练集预测类别时具有很高的准确性。

Data · Model · Agent · Repeat 2173

Python中的装饰器@property用法总结

property是Python实现“受控属性”的核心工具,既能让代码更简洁(方法属性化),又能灵活控制属性的读取、赋值和删除逻辑,广泛用于数据校验、动态计算、接口兼容等场景。

d20062056的博客 1018

YOLOv11改进-卷积-引入小波卷积WTConv 解决多尺度小目标问题

1.首先,WTConv利用二维Haar小波变换对输入图像进行多级分解。低频分量 (LL):捕捉图像的低频信息,如整体形状或轮廓。水平高频分量 (LH):捕捉图像中的水平边缘信息。垂直高频分量 (HL):捕捉图像中的垂直边缘信息。对角线高频分量 (HH):捕捉图像的对角线细节。在每一级的小波变换中,图像被下采样(空间分辨率减半),但频率信息得到了更细的分解。递归地执行小波变换(称为多级分解)可以得到不同尺度下的频率分量。

qq_64693987的博客 1万+

【推荐100个unity插件之34】在unity中实现和Live2D虚拟人物的交互——Cubism SDK for Unity

Live2D是一款2D建模的软件,常用于游戏,动态壁纸,虚拟主播,游戏公司里面是有专门的ive2D岗位的。游戏里面还有一个经常使用的软件——spine,他做的也是2d的模型,但是他更适合做一些动作,Live2D更适合人物交互方面。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4999

Python @装饰器

装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数(与java的注释类似)。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。 装饰器的本质:在不改变被装饰对象原有的“调用方式”和“内部代码”的情况下给被装饰对象添加新的功能。原则就是对扩展开放,对修改封闭使用场景AOP切面日志权限拦截HTTP请求数据处理 *args, **kwargs 获取所有参数进行赋值 目标返回值是wrapper函数中return

qq_43710438的博客 922

C#与倍福TwinCAT3通信实战:ADS协议封装与设备变量读写完整源码

倍福(Beckhoff)TwinCAT3 作为工业自动化领域主流的软PLC系统,其内置的ADS(Automation Device Specification)协议是实现上位机与TwinCAT3通信的核心标准。传统ADS通信开发存在门槛高(协议细节复杂)、稳定性差(缺乏统一异常处理)、复用性低(重复编码)等问题。本文基于 C# 技术栈,聚焦“协议封装标准化、变量读写易用化、通信稳定工业化”核心需求,提供一套完整的 ADS 协议封装方案与设备变量读写源码。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1987

Python @ 语法糖,装饰器(详解)

自定义的装饰器是@+自定义的闭包,可以动态的将装饰器化的函数功能添加在其他函数上。 form functools import wraps @wraps(func) 解决安装装饰器后注释信息不能显示的问题。安装在装饰器闭包函数的外层函数中与装饰器外层函数导入同一个参数 from functools import wraps def timer(fun): @wraps(fun) d...

山人甲 Python博客 2618

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Python装饰器详解:从@语法糖到函数包装的底层原理与实战

函数是Python中的一等公民,可以作为参数传递、赋值给变量,这一特性催生了函数式编程中常见的“包装”机制。装饰器本质上就是利用闭包和高阶函数,在不修改原函数代码的前提下,为函数动态附加权限校验、日志记录、计时缓存等横切逻辑。通过@语法糖,装饰器以声明式风格出现在函数定义上方,让代码更简洁、可读性更强,在Web开发、接口调用、性能优化等真实场景中有着广泛应用。理解装饰器的执行顺序、参数传递以及functools.wraps对元信息的保留,是函数式编程进阶的关键,也是Python开发者从入门到工程落地的必经之

weixin_28347369的博客 250

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Python装饰器从底层原理到实战:函数对象、闭包与@语法糖全解析

在Python编程中,函数是一等公民,可像变量一样传递;闭包则让内层函数记住外层环境。这两大机制构成装饰器的底层基础。装饰器本质上就是接收一个函数并返回一个新函数,通过@语法糖简化写法,让日志、缓存、重试、鉴权等横切逻辑与业务代码解耦。内置的functools.wraps能保留原函数元信息,避免调试与文档生成时的坑;类装饰器和内置装饰器(如property、lru_cache)进一步扩展了应用场景。理解装饰器的执行时机与叠加顺序,能帮助开发者设计出更清晰、可维护的Python代码,在真实工程中优雅地组合复用

weixin_27015733的博客 232

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Python装饰器从原理到实战:彻底搞懂@语法糖

在Python编程进阶中,函数作为一等公民的特性让代码具备了高度灵活性,而闭包机制则为内层函数保留了外部变量的访问能力。基于这两大基础,Python提供了一种优雅的语法糖——装饰器,它通过@符号实现函数的替换与增强,使开发者无需修改原函数即可附加日志记录、性能计时、权限校验、失败重试等横切逻辑。无论是Web开发、爬虫脚本还是量化策略,装饰器都是提升代码复用性与可维护性的核心工具。本文从函数对象传递出发,逐步拆解装饰器的实现原理,对比手动包装与@写法的等价关系,并深入探讨带参数装饰器、类装饰器、多层装饰器的执

weixin_42565652的博客 228

python中@的作用

在 Python 中,`@` 符号主要用于装饰器(Decorator)的语法糖,用来简化装饰器的调用方式。装饰器是一种特殊的函数,它可以用来修改其他函数的功能,而无需改变被修饰函数的源代码。`@` 符号的作用是将其下方的函数作为参数传递给 `@` 后面的装饰器函数。

m0_63090136的博客 390

Python装饰器必知必会:从闭包原理到@语法糖与实战避坑

在Python编程中,函数是一等公民,可以被赋值、传递和返回,这为函数包装提供了基础;闭包则让内部函数记住外部变量的上下文,构成装饰器的底层支撑。通过@语法糖,开发者可以在不改动原函数代码与调用方式的前提下,为函数动态附加日志、计时、重试、权限校验等通用能力,从而将横切关注点与业务逻辑解耦。缓存计算结果、Web接口鉴权、第三方服务调用重试等场景都依赖这套机制。实际使用中还涉及函数元信息保留、带参数装饰器的三层嵌套、多个装饰器叠加顺序等工程问题,掌握这些才能真正从“会用”过渡到“懂它”,写出更干净、更可维护的

weixin_29248611的博客 264

Python装饰器:从语法糖到实战应用全解析

装饰器是Python中基于闭包和函数式编程的高级特性,通过@语法糖实现函数功能的动态扩展。其核心原理是利用函数作为一等对象的特性,在不修改原函数代码的情况下实现功能增强。装饰器在工程实践中具有重要价值,常用于日志记录、性能分析、缓存优化、权限校验等场景。以标准库中的@lru_cache为例,通过记忆化技术将斐波那契数列计算复杂度从O(2^n)降至O(n),显著提升性能。在Web开发中,Flask的路由注册和Django的登录验证都依赖装饰器实现。掌握带参数的装饰器编写和functools.wraps元信息保

weixin_29245767的博客 219

从零推导 Python 装饰器:不用背语法,看完这篇就懂了

从零推导 Python 装饰器:3 步搞懂原理,5 个坑全避开,附 2 个实战案例。不用背语法,看完就懂。

m0_73763999的博客 337

Python 装饰器到底是个啥?从 @ 符号到手写一个,5 个例子讲透

系列:Python 底层设计逻辑|类型:原理拆解型|分发:优快云 / 掘金 / 51CTO / 阿里云 / 知乎字数:约 1600 字@logdef foo()

小小张说故事的博客 192

Python装饰器从入门到实战:闭包、语法糖与坑位指南

函数作为一等公民与闭包机制,是Python实现装饰器的两大基石。装饰器通过高层包装函数实现横切关注点复用,配合@语法糖可优雅地为业务代码统一添加日志、计时、缓存、权限校验等能力。理解functools.wraps保留元信息、带参数装饰器的三层嵌套以及类装饰器的状态管理,是写出健壮代码的关键。从实际工程场景出发,本文整理了TTL缓存、重试、权限校验等案例,并剖析装饰器叠加顺序、闭包延迟绑定等常见陷阱,帮助开发者系统性掌握从基础语法到项目落地的完整路径。

weixin_30444111的博客 228

Python装饰器原理与应用全解析

装饰器是Python中基于高阶函数实现的语法特性,通过@符号提供了一种优雅的AOP编程范式。其核心原理是利用函数作为一等公民的特性,实现函数包装与功能增强。在工程实践中,装饰器常用于实现横切关注点,如性能监控(使用timing装饰器)、缓存优化(如lru_cache)、权限控制等通用功能模块。这种非侵入式的编程方式既能保持代码整洁,又能提高复用性,特别适合Web开发、性能优化等场景。理解装饰器工作机制有助于掌握Python元编程精髓,是进阶Python开发的必备技能。

weixin_29258297的博客 345

Python装饰器详解:从闭包原理到生产级实战

在Python编程中,函数不仅是执行代码的单元,更是一等公民,可以像变量一样传递和返回。正是基于这一特性,装饰器得以实现——它本质上是一个接收函数并返回新函数的高阶函数,通过@语法糖让代码更简洁。闭包机制则是装饰器工作的核心,它让内层函数记住外层函数的变量,从而实现对原函数的无侵入式增强。装饰器的技术价值在于将日志、缓存、重试、权限校验等横切逻辑从业务代码中剥离,大幅提升代码复用性和可维护性。无论是Web开发中的鉴权、数据库操作的重试,还是接口调用的耗时统计,装饰器均能发挥巨大作用。本文从底层机制出发,手写

weixin_31309419的博客 226

Python装饰器详解:从闭包、语法糖到工程实战应用

在Python编程中,函数不仅是代码块,更是一等对象,可被传递和返回,这为高阶函数与闭包机制奠定了基础。闭包使得内层函数能记住外层变量,而装饰器正是基于这一原理,通过语法糖@将额外功能优雅地附加到原函数上,实现日志记录、性能计时、权限校验、结果缓存与失败重试等通用逻辑的复用。它让开发者在不修改业务函数代码的前提下,轻松实现横切关注点的集中管理,大幅提升代码可维护性。无论是Web开发中的登录校验、数据分析中的耗时统计,还是网络请求的异常重试,装饰器都是工程实践中不可或缺的瑞士军刀。掌握其工作原理与编写范式,将

weixin_29306261的博客 234
上一篇: python 用所有标点符号分隔句子
下一篇: ElasticSearch语法——增删改查
HappyRocking
博客等级 码龄12年 222粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值