理解Python装饰器(Decorator)

RT-DETR改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进RT-DETR颈部网络 本文记录的是利用颈部结构优化RT-DETR的目标检测网络模型。利用改进后的颈部网络,通过跳层连接,避免了在进行反向传播时的梯度消失问题,并且引入跨尺度连接,可以实现不同级别和层次的特征充分融合,获取足够的高层语义信息和低层空间信息交换,从而在大规模变化场景下提高检测性能。GIRAFFEDET: A HEAVY-NECK PARADIGM FOR OBJECT DETECTION-GFPN包含了上述的跳层连接(dense-link和log2nlog _{2} nlog2​n-link)以及跨尺度连接(Quee 阅读详情

理解Python装饰器(Decorator)

Python装饰器看起来类似Java中的注解,然鹅和注解并不相同,不过同样能够实现面向切面编程。

想要理解Python中的装饰器,不得不先理解闭包(closure)这一概念。

闭包

看看维基百科中的解释:

在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function
closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。

官方的解释总是不说人话,but–talk is cheap,show me the code:

# print_msg是外围函数
def print_msg():
    msg = "I'm closure"

    # printer是嵌套函数
    def printer():
        print(msg)

    return printer


# 这里获得的就是一个闭包
closure = print_msg()
# 输出 I'm closure
closure()

msg是一个局部变量,在print_msg函数执行之后应该就不会存在了。但是嵌套函数引用了这个变量,将这个局部变量封闭在了嵌套函数中,这样就形成了一个闭包。

结合这个例子再看维基百科的解释,就清晰明了多了。闭包就是引用了自有变量的函数,这个函数保存了执行的上下文,可以脱离原本的作用域独立存在。

下面来看看Python中的装饰器。

装饰器

一个普通的装饰器一般是这样:

import functools


def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print('call %s():' % func.__name__)
        print('args = {}'.format(*args))
        return func(*args, **kwargs)

    return wrapper

这样就定义了一个打印出方法名及其参数的装饰器。

调用之:

@log
def test(p):
    print(test.__name__ + " param: " + p)
    
test("I'm a param")

输出:

call test():
args = I'm a param
test param: I'm a param

装饰器在使用时,用了@语法,让人有些困扰。其实,装饰器只是个方法,与下面的调用方式没有区别:

def test(p):
    print(test.__name__ + " param: " + p)

wrapper = log(test)
wrapper("I'm a param")

@语法只是将函数传入装饰器函数,并无神奇之处。

值得注意的是@functools.wraps(func),这是python提供的装饰器。它能把原函数的元信息拷贝到装饰器里面的 func 函数中。函数的元信息包括docstring、name、参数列表等等。可以尝试去除@functools.wraps(func),你会发现test.__name__的输出变成了wrapper。

带参数的装饰器

装饰器允许传入参数,一个携带了参数的装饰器将有三层函数,如下所示:

import functools

def log_with_param(text):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            print('call %s():' % func.__name__)
            print('args = {}'.format(*args))
            print('log_param = {}'.format(text))
            return func(*args, **kwargs)

        return wrapper

    return decorator
    
@log_with_param("param")
def test_with_param(p):
    print(test_with_param.__name__)

看到这个代码是不是又有些疑问,内层的decorator函数的参数func是怎么传进去的?和上面一般的装饰器不大一样啊。

其实道理是一样的,将其@语法去除,恢复函数调用的形式一看就明白了:

# 传入装饰器的参数,并接收返回的decorator函数
decorator = log_with_param("param")
# 传入test_with_param函数
wrapper = decorator(test_with_param)
# 调用装饰器函数
wrapper("I'm a param")

输出结果与正常使用装饰器相同:

call test_with_param():
args = I'm a param
log_param = param
test_with_param

至此,装饰器这个有点费解的特性也没什么神秘了。

装饰器这一语法体现了Python中函数是第一公民,函数是对象、是变量,可以作为参数、可以是返回值,非常的灵活与强大。

Python中引入了很多函数式编程的特性,需要好好学习与体会。

作者:聪明叉
链接:https://www.jianshu.com/p/ee82b941772a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

MCAL中Dsadc的配置 DSADC模块作为一个专用的模块,主要应用在编码器软解码,功能强大而复杂,这里介绍了Dsadc的mcal配置和详细描述,让你全面学习和理解这个模块功能和应用。 阅读详情

相关推荐

嵌入式NTC温度解算库:Steinhart-Hart定点实现与硬件解耦设计

NTC热敏电阻是嵌入式系统中最常用的模拟温度传感器,其阻值-温度关系高度非线性,需依赖Steinhart-Hart方程实现高精度转换。该方程通过三参数对数多项式建模,理论上可将误差控制在±0.1°C以内,但直接移植到MCU面临浮点开销大、定点溢出、系数精度损失等工程瓶颈。为此,归一化处理(ln(R/R₂₅))、Q24.8定点运算、查表+插值对数计算等优化技术成为资源受限场景下的关键技术路径。其核心价值在于将ADC采样与温度解算彻底解耦,适配各类HAL/裸机/RTOS环境,广泛应用于电池管理、工业PLC、Io

weixin_35756624的博客 647

理解python装饰器(Decorator)

笔者也是初学python,在看代码的时候遇到了装饰器函数,现对装饰器做出以下简单理解。 何谓闭包: 闭包就是能够读取其他函数内部变量的函数。这是百度百科给出的定义。 简言之,就是在一个函数中定义了两种函数,一种是内部函数,另一种是外部函数。外部函数的返回值为内部函数。这种情形称之为闭包。 闭包必须返回函数对象,且返回的函数对象必须引用外部变量。 闭包格式如下: def wai(a,b...

qq_38915364的博客 446

HPC软件使用之ANSYS Fluent

本文介绍了如何在超级计算机上使用ANSYS Fluent进行科学计算和工程仿真。文章首先对Fluent软件进行了简要介绍,强调了其在计算流体力学领域的广泛应用和强大功能。接着,详细说明了如何编写jou脚本文件和slurm脚本文件,以控制Fluent的计算流程和作业提交。文章还提供了作业提交和查看的具体命令,并通过一个鼓风机仿真的案例演示了从网格模型准备、脚本编写、作业提交到结果查看的完整流程。最后,展示了使用Fluent进行结果可视化的方法。

欢迎各位大佬光临“寒舍”!请多多指点,共同进步! 2206

通俗的理解Python装饰器所有用法(Decorator)

在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。 作者:聪明叉 链接:<a href='https://www.jianshu.com/p/ee82b941772a'>https://www.jianshu.com/p/ee82b941772a</a> 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非

Deft_MKJing的博客 1324

【从零开始入门unity游戏开发之——C#篇01】理论开篇,理解什么是编程

理论开篇,理解什么是编程

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

AD9361功能介绍和使用

AD9361使用分数分频锁相环(PLL)来产生发射机和接收机本地振荡器(LO)频率和BB PLL。BB PLL 可用于数据转换、数字滤波器和 |/O 端口。PLL的参考时钟可以由外部振荡器或外部晶体(XO)和数字可编程片内可变电容提供,电容微调产生参考时钟频率,XO和微调电容的组合统称为DCXO。有多个天线输入的分集系统。接收链数据首先经过低噪声放大器(LNA),然后是同相(1)和正交(Q)放大器,混频器和频带整形滤波器,可将接收到的信号下变频为基带以进行数字化。时分双工(TDD)和频分双工(FDD)。。。

wangjie36的博客 1万+

Python装饰器(Decorator)完全指南-基础篇

Python中decorator事实上即是一个接受函数作为输入变量并返回另一个函数对象的函数。

正西风落叶下长安 1108

YOLOv8交通监控全方案:精准车辆计数+违章(闯红灯/压线)识别,拿来就落地!

作为深耕计算机视觉落地的开发者,我见过太多交通监控的“伪智能”——传统系统要么车辆计数不准(漏计/重复计数),要么违章识别滞后(靠人工回看录像),甚至连“闯红灯、压线”这类常见违章都无法实时判定,完全满足不了实际交通管理需求。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 646

python 装饰器decorator 理解

个人理解:decorator的作用起到了代理作用,通过注解构造了一个 入参是函数,返回值同样是函数的一个函数。有些绕嘴~ 要理解万物皆对象,函数同样是个对象就好。注释里的标记希望对你的理解有帮助。ps: *args, **kwargs 的含义是解包,主要为了承接任何参数。*是list,**是字典。

一只笨鸟的博客 340

23、电器元件符号及封装大全(2025版本)

总计28类电器元件符号和封装。

XU157303764的博客 2649

Google Play上架:谷歌2024年5月份审核政策改动,审核强度逐步提升

Google Play上架:谷歌2024年5月份审核政策改动,审核强度逐步提升

专业解决各种上架过包问题,专业团队专业处理 3187

理解Python的装饰器 decorator

既然是装饰器, 肯定就是跟设计模式中的装饰模式有关了装饰器就是python 中对装饰模式的一种注解实现,令其可以对其他函数进行一些功能上的增强。住这里的增强并不是真正的修改函数的业务逻辑, 只是前后增加一些步骤。

nvd11的专栏 880

GPU 资源池化云平台解决方案​

定义与特点Kubernetes是一个开源的容器编排和管理平台,通过提供自动化和声明式的方式来部署、扩展、维护和运行应用程序。它支持跨多个主机和集群部署容器,确保应用程序的高可用性和可扩展性。Kubernetes提供了丰富的功能和插件,允许用户根据自己的需求进行定制和扩展。架构与组件控制平面(Control Plane):负责集群的决策(如调度)和集群状态的检测与响应。

ZhangJiqun&191cm&85kg 1159

Python中装饰器(Decorator)的理解

之前经常看到‘@’这个符号在代码里出现,后来才知道这是装饰器,借这个机会,看了一些博客,写了一些demo,记录一下浅显的理解 主要内容语法糖(Syntactic sugar)装饰器(Decorator)无参数装饰器多参数的装饰器多装饰器装饰器的返回值 语法糖(Syntactic sugar) 由英国计算机科学家Peter.J.Landin发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言...

anfanger_z的博客 404

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

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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

深入理解Python 装饰器(decorator)

返璞归真, 看山还是山 刚看到Python装饰器时, 觉得很神奇。简单实验下,发现也就那么回事。但是慢慢的看到越来越多的装饰器。很多时候又不了解到底是怎么回事了。最后还是决定好好研究下。先看看一些实例, 然后再来分析下原理 假设我们有如下的基本函数def do_something(): for i in range(1000000): pass print "pla

1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【python】理解Python装饰器(Decorator)

Python装饰器看起来类似Java中的注解,然鹅和注解并不相同,不过同样能够实现面向切面编程。 想要理解Python中的装饰器,不得不先理解闭包(closure)这一概念。 1. 闭包 看看维基百科中的解释: 在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将...

不可能打工的博客 123

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

python装饰器-理解Python装饰器(Decorator)

理解Python装饰器(Decorator)Python装饰器看起来类似Java中的注解,然鹅和注解并不相同,不过同样能够实现面向切面编程。想要理解Python中的装饰器,不得不先理解闭包(closure)这一概念。闭包看看维基百科中的解释:在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量...

weixin_37988176的博客 112

装饰器python_理解Python装饰器(Decorator)

理解Python装饰器(Decorator)Python装饰器看起来类似Java中的注解,然鹅和注解并不相同,不过同样能够实现面向切面编程。想要理解Python中的装饰器,不得不先理解闭包(closure)这一概念。闭包看看维基百科中的解释:在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量...

weixin_39812577的博客 99

真正的理解Python的装饰器(Decorator)

什么是装饰器?装饰器可以用来干什么?相信不少Python开发者都遇到过这样的问题,你可以通过这篇来寻找答案!

qq_45430571的博客 334

深入理解 Python 中的装饰器(Decorator)

在 Python 中,装饰器(Decorator)是一个强大且广泛使用的功能,它能够动态地增加或修改函数、方法或类的行为,而无需改变其内部代码。Python 中的装饰器是一个非常强大的工具,它允许我们在不修改原始代码的情况下,动态地为函数、方法或类添加新的行为或修改现有行为。Python 允许我们在一个函数上应用多个装饰器,装饰器的应用顺序从下至上(即,靠近函数定义的装饰器先执行)。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。在很多实际应用中,我们需要装饰器能够处理带有参数的函数。

feifeicode的博客 677

python decorator模块_对Python中装饰器(Decorator)的理解与进阶

有时候我们项目中的某些功能做些修改即需要对内部的某些函数添加一些附加功能,但是为了安全起见不想改变函数的源代码以及函数的调用方式,那么装饰器在这个地方会给我们带来很大的帮助。装饰器(Decorator):(又叫语法糖)定义:本质是函数,功能(装饰其它函数)就是为其他函数添加附加功能原则:(1).不能修改被装饰的函数的源代码(2).不能修改被装饰的函数的调用方式1.先来实现一个简单的装饰器示例:#!...

weixin_39959482的博客 85

对于Python装饰器的理解 The understanding of Python decorator

我的理解是在Python中,装饰器(decorator)是可以返回函数的一种函数。 装饰器的作用就是在不修改一个函数本身的情况下,返回一个包含原函数的一个新的函数,这个函数除了拥有原函数的功能外,还在外面加了一层“壳”,这层壳赋予了这个函数新的功能。那么在这样的情况下,本身函数并没有受到任何影响,但是却有了新的功能。 Okay,让我们再来看看看装饰器是怎么运作的。 首先我们定义一个函数displa...

baiyao_12的博客 199

一篇文章理解Python 装饰器(Decorator)

Python 装饰器(Decorator)可以在不改变函数代码和引用方式的情况下给函数增加新的功能。 提起Python 装饰器,大家必定感觉特别神秘。其实装饰器本质上就是一个函数(func_A),它接受被装饰的函数(func_B)作为参数,并在其内部嵌套了一个函数(func_C),func_C 对被装饰的函数B进行封装(通常是在func B的前后增加一些功能),然后返回这个包装过的函数fun...

katrinawj的博客 442

超简单的python装饰器(decorator)——理解与应用

超简单的python装饰器(decorator)——理解与应用

algorithm learning blog 342

深入理解 Python 中的装饰器(Decorator)及其应用

装饰器本质上是一个。

2401_89900962的博客 1340

轻松理解 Python中的装饰器(decorator)

装饰器是Python中很重要的一个功能, 一句话总结装饰器就是: 将被装饰函数作为参数传入装饰函数中, 并实现装饰函数中的多余功能.

bo17244504的博客 654
上一篇: Nginx 原理和架构
下一篇: 【读书笔记】《鸟哥的LINUX私房菜》- 命令行模式下命令的执行
xy_cpp
博客等级 码龄10年 119粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值