【实测】:python的装饰器如何传参?

简介: 【实测】:python的装饰器如何传参?

好的,今日博主在设计一个django权限控制器的时候,陷入到了一个问题中,就是如何多角度的给一个函数的装饰器传参。问题并不难,也完美解决。所以这里要给大家用 土话 来讲一下装饰器和不同方式传参的方法。


一:先明白下什么是装饰器?

   装饰器就相当于给你当前的这个函数增加点装饰效果,外挂效果等的函数。它接收你这个函数为参数,然后装饰加工完再帮你运行。


二:函数本身也可以当做参数

   众所周知,函数后面加括号是调用,不加括号代表是本身,其实函数也是个对象。

所以看这个demo:

image.png

如图,我调用x,把函数a当做参数传递给x,其中我特意用func作为一个参数变量,虽然你叫什么都可以,但是大家以后记住在任何教程中看到func就代表一个函数变量,别问为啥,这是规矩。

输出的结果是:

image.png

如图可以见,x确实运行了,并且打印了函数a的名字:a ,但是函数a本身并未运行,所以内部的hello无法执行打印。


然后我们在x函数中对a函数进行稍微的加工,不加工你要装饰器干嘛?

所以按照人家规定,我们需要在x中新增了个内部函数y,y负责对a进行加工(其实就是帮忙运行一下a或者在之前之后做点别的事), 定义了y之后,在x的结尾要运行y 才有意义。此时我们再调用x,就会发现,a也被执行并打印了hello。

比如我们再打印a之后再打印别的文字,就相当于进行了简单装修加工


image.png

这样的效果,才是一个装饰器存在的意义。


此时,函数x 就是 函数a的装饰器,但是不用这么写,python叫你用@的方式来写,继续往下看!


三,装饰器写法

image.png

如图,装饰器的简单写法就是上面这样了,直接在函数a脑袋上用回形针别了个函数x,这样我们真正调用的时候就无需调用x了,直接还是按照原始的调用a就可以了就是a()。但是因为我们变成了调用函数a,所以也就无需函数x的最后帮忙去调用y函数,而是直接把y函数返回就行了,我们a函数自己会调用,不用它帮忙!


大家如果还没完全理解,也是正常的,但是请死记硬背上面的这段代码哦,因为后面复杂的全是由这个升级来的。



四:装饰器传参数


实际运用中,肯定需要传递数据给装饰器,不然装饰器就瞎装修了。

传参数一共有3个路线传参:


路线一:a函数的入参给到装饰器里用

image.png

如上图,func在装饰器内就相当于a函数本身,但是要通过y函数来接收所有参数才行,args和kwargs是python基础知识,代表接收所有参数,这里不多做赘述,不明白的可以报我培训班,按照路线正式学一遍。


你可以理解为,a函数送去装修团队手里装修了,你要给它递点东西,肯定要人家装修团队的人从你手接过去,然后再安装到a函数身上的意思,所以是在y函数上进行首次接收。


路线二:让装饰器自己接收参数


这个传参就比较难了,因为目前的结构并不支持,必须要再多加一层包装才行。因为目前x函数负责接收a函数本体,y函数负责接收a函数的参数。那外来的其他参数 就只能在它们最外层再包一层z,来接收了。


如图:

image.png

改成了上图这样后,你想单独给装饰器传的参数money,就可以直接给了。z负责接收。


最后,为了便于大家记住这个装饰器,我教大家一个联想记忆。


大家把这个装饰器看成一个装修施工团队,你的a函数就是你的毛坯房。其中z函数是财务,负责接收你给的钱,x函数是施工方,负责接收你的房子a。y函数是打杂的,负责接收你的买的一些家电家具。


然后我们看本集最坑的第三种路线传参:

路线三:函数本身快照


相当于装饰器施工团队,可以直接获取你这套房子本身的一些属性,比如名字,说明等。也就是函数的__name__和__doc__等等一大堆__开头的属性。

image.png

看上图,在装饰器中打印了下函数a的固有属性,发现都可以正常打印。


结果有的同学就说了,这第三种路线传参,是不是就是通过更改赋值函数a本身的属性来让装饰器拿到新的数据?


咱试一下,把a函数的__doc__属性更改,看看怎么样?

image.png


如图可以看到,无论你怎么在函数内修改函数的属性,但是装饰器都更早的时候已经写死了属性,相当于提前照了快照,所以不会产生变化,所以这条路线传参数是不行的。


相关文章
|
27天前
|
程序员 测试技术 开发者
Python装饰器:简化代码的强大工具
Python装饰器:简化代码的强大工具
151 92
|
3月前
|
Python
掌握Python装饰器:轻松统计函数执行时间
掌握Python装饰器:轻松统计函数执行时间
253 76
|
4月前
|
人工智能 API Python
掌握 Python 文件处理、并行处理和装饰器
本文介绍了 Python 在文件处理、并行处理以及高级功能(如装饰器、Lambda 函数和推导式)的应用。第一部分讲解了文件的基本操作、读写方法及处理大型文件的技巧,并演示了使用 Pandas 处理结构化数据的方式。第二部分探讨了多线程与多进程的并行处理,以及 `concurrent.futures` 模块的简化用法,适合不同类型的任务需求。第三部分则深入装饰器的实现与应用,包括简单装饰器、带参数的装饰器及 `functools.wraps` 的使用,同时简要介绍了 Lambda 函数和推导式的语法与场景。内容实用且全面,帮助读者掌握 Python 高效编程的核心技能。
|
9月前
|
测试技术 数据安全/隐私保护 开发者
探索Python中的装饰器:从基础到高级应用
装饰器在Python中是一个强大且令人兴奋的功能,它允许开发者在不修改原有函数代码的前提下增加额外的功能。本文将通过具体代码示例,带领读者从装饰器的基础概念入手,逐步深入到高级用法,如带参数的装饰器和装饰器嵌套等。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
105 6
|
9月前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
128 6
|
9月前
|
开发者 Python
探索Python中的装饰器:从基础到高级应用
本文将带你深入了解Python中的装饰器,这一强大而灵活的工具。我们将一起探讨装饰器的基本概念,它们如何工作,以及如何使用它们来增强函数和类的功能,同时不改变其核心逻辑。通过具体代码示例,我们将展示装饰器的创建和使用,并探索一些高级应用,比如装饰器堆栈和装饰带参数的装饰器。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角,帮助你更有效地使用装饰器来简化和优化你的代码。
|
8月前
|
测试技术 数据库 Python
Python装饰器实战:打造高效性能计时工具
在数据分析中,处理大规模数据时,分析代码性能至关重要。本文介绍如何使用Python装饰器实现性能计时工具,在不改变现有代码的基础上,方便快速地测试函数执行时间。该方法具有侵入性小、复用性强、灵活度高等优点,有助于快速发现性能瓶颈并优化代码。通过设置循环次数参数,可以更准确地评估函数的平均执行时间,提升开发效率。
228 61
Python装饰器实战:打造高效性能计时工具
|
8月前
|
设计模式 前端开发 Shell
Python装饰器是什么?
装饰器是Python中用于动态修改函数、方法或类功能的工具,无需改变原代码。通过将函数作为参数传递并返回新函数,装饰器可以在原函数执行前后添加额外逻辑。例如,使用`@logger`装饰器可以打印函数调用日志,而`@timethis`则可用于计算函数执行时间。为了保持被装饰函数的元信息(如`__name__`和`__doc__`),可使用`functools.wraps`装饰器。此外,带参数的装饰器可通过嵌套函数实现,如`@timeitS(2)`,以根据参数条件输出特定信息。
152 59
|
9月前
|
缓存 Python
深入理解Python中的装饰器
本文旨在通过具体实例和详细解释,帮助读者深入理解Python中装饰器的工作原理及其在实际开发中的应用。我们将从装饰器的基本概念开始,逐步深入到其高级用法,包括自定义装饰器、带参数的装饰器以及类装饰器等。通过本文的学习,读者将能够掌握装饰器的核心思想,提高代码的可读性和可维护性。

热门文章

最新文章

推荐镜像

更多