【实测】: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


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


相关文章
|
2天前
|
数据安全/隐私保护 Python
探索Python中的装饰器:简化代码,提升效率
【9月更文挑战第32天】在Python编程世界中,装饰器是一个强大的工具,它允许我们在不改变函数源代码的情况下增加函数的功能。本文将通过直观的例子和代码片段,引导你理解装饰器的概念、使用方法及其背后的魔法,旨在帮助你写出更加优雅且高效的代码。
|
2天前
|
开发者 Python
深入理解Python中的装饰器
【9月更文挑战第33天】本文将通过浅显易懂的语言和生动的比喻,带领读者走进Python装饰器的奇妙世界。我们将从装饰器的基本概念出发,逐步探索其背后的原理,并通过实际代码示例,展示如何运用装饰器优化我们的代码结构。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你打开一扇通往高效编码的大门。
|
2天前
|
存储 缓存 开发者
探索Python中的装饰器:从基础到高级应用
【9月更文挑战第33天】本文将带你走进Python的装饰器世界,从理解其核心概念出发,逐步深入到实现机制与应用场景。我们将通过实际代码示例,展示如何利用装饰器简化代码、增强函数功能,并讨论装饰器的高级用法,如带参数装饰器和装饰器嵌套。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的洞见和实用技巧。
12 4
|
9天前
|
设计模式 缓存 测试技术
探索Python中的装饰器:从基础到高级应用
在本文中,我们将深入探讨Python中的装饰器,这是一种强大且灵活的工具,用于扩展或修改函数的行为。我们将从装饰器的基本概念和定义开始,逐步讲解它们的工作原理、如何创建和使用它们。接着,我们会探讨一些常见的装饰器用例,如日志记录、缓存和权限控制等。最后,本文将讨论一些高级话题,包括带参数的装饰器、使用functools模块增强装饰器以及装饰器与类方法的兼容问题。通过综合运用这些知识,您将能够更有效地利用Python的装饰器来优化您的代码。
21 10
|
2天前
|
监控 数据安全/隐私保护 Python
探索Python装饰器的本质与应用
本文深入探讨了Python中装饰器(Decorator)的工作原理、实际应用及其在软件开发中的重要性。通过浅显易懂的语言解释什么是装饰器,如何创建和运用装饰器来增强函数和类的功能。同时,文章还涵盖了一些高级主题,如带参数的装饰器、多层装饰以及装饰器的实际应用案例,帮助读者更全面地理解和掌握这一强大的编程工具。
6 1
|
6天前
|
Python
? Python 装饰器入门:让代码更灵活和可维护
? Python 装饰器入门:让代码更灵活和可维护
12 4
|
6天前
|
缓存 测试技术 Python
探索Python中的装饰器:简化代码,提高可读性
【9月更文挑战第28天】在Python编程中,装饰器是一个强大的工具,它允许我们在不修改原有函数代码的情况下增加额外的功能。本文将深入探讨装饰器的概念、使用方法及其在实际项目中的应用,帮助读者理解并运用装饰器来优化和提升代码的效率与可读性。通过具体示例,我们将展示如何创建自定义装饰器以及如何利用它们简化日常的编程任务。
11 3
|
8天前
|
Python
python方法,传参20220101 计算与当前时间差
python方法,传参20220101 计算与当前时间差
|
7天前
|
Python
Python 装饰器入门:让代码更灵活和可维护
Python 装饰器入门:让代码更灵活和可维护
12 1
|
9天前
|
Python
探索Python编程中的装饰器魔法
【9月更文挑战第26天】在Python的世界里,装饰器就像是一把瑞士军刀,小巧而功能强大。它们让代码更简洁、可维护性更强。本文将通过实际示例,带你领略装饰器的魔力,从基础到进阶,一步步揭开它的神秘面纱。
13 2
下一篇
无影云桌面