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


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


相关文章
|
15天前
|
Python
深入理解Python装饰器:从入门到实践####
本文旨在通过简明扼要的方式,为读者揭开Python装饰器的神秘面纱,从基本概念、工作原理到实际应用场景进行全面解析。不同于常规的摘要仅概述内容概要,本文将直接以一段精炼代码示例开篇,展示装饰器如何优雅地增强函数功能,激发读者探索兴趣,随后深入探讨其背后的机制与高级用法。 ####
46 11
|
12天前
|
设计模式 缓存 开发者
深入浅出Python装饰器
【10月更文挑战第39天】本文将通过浅显易懂的语言和生动的比喻,带你探索Python中一个神奇而又强大的特性——装饰器。我们将一起揭开装饰器的神秘面纱,了解它的工作原理,并通过实际代码示例学习如何应用它来美化我们的代码。无论你是编程新手还是有经验的开发者,这篇文章都将为你打开一扇新的大门,让你的代码更加优雅和高效。
|
12天前
|
缓存 测试技术 数据库
深入理解Python中的装饰器
在本文中,我们将探讨Python语言中一个强大而灵活的特性——装饰器。装饰器允许开发者在不修改原有函数或方法代码的情况下增加额外的功能,这大大提高了代码的复用性和可读性。通过具体示例和应用场景的讲解,本篇文章旨在为读者提供一个关于如何使用装饰器的全面指南,包括装饰器的定义、使用场景、以及如何自定义装饰器等内容。
|
16天前
|
设计模式 Python
掌握Python中的装饰器
【10月更文挑战第34天】装饰器是Python中一种强大的工具,它允许我们在不修改原函数代码的情况下增加其功能。本文通过简单易懂的语言和实例,引导你理解装饰器的概念、种类及其应用,帮助你在编程实践中灵活使用这一高级特性。
|
7天前
|
开发框架 缓存 测试技术
Python中的装饰器:魔法般的功能增强
在Python编程中,装饰器是一种强大而灵活的工具,它允许开发者修改或扩展函数和类的行为。本文将深入探讨Python装饰器的工作原理,并通过实例演示如何创建和使用自定义装饰器来增强代码的功能性和可读性。我们将从基础概念讲起,逐步深入到高级应用,揭示装饰器背后的“魔法”,并展示它们在实际开发中的多种用途。
|
13天前
|
缓存 监控 测试技术
Python中的装饰器:功能扩展与代码复用的利器###
本文深入探讨了Python中装饰器的概念、实现机制及其在实际开发中的应用价值。通过生动的实例和详尽的解释,文章展示了装饰器如何增强函数功能、提升代码可读性和维护性,并鼓励读者在项目中灵活运用这一强大的语言特性。 ###
|
16天前
|
缓存 开发者 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第35天】装饰器在Python中是一种强大的工具,它允许开发者在不修改原有函数代码的情况下增加额外的功能。本文旨在通过简明的语言和实际的编码示例,带领读者理解装饰器的概念、用法及其在实际编程场景中的应用,从而提升代码的可读性和复用性。
|
11天前
|
设计模式 缓存 开发框架
Python中的装饰器:从入门到实践####
本文深入探讨了Python中装饰器的工作原理与应用,通过具体案例展示了如何利用装饰器增强函数功能、提高代码复用性和可读性。读者将学习到装饰器的基本概念、实现方法及其在实际项目开发中的实用技巧。 ####
23 3
|
12天前
|
Python
探索Python中的装饰器:简化代码,提升效率
【10月更文挑战第39天】在编程的世界中,我们总是在寻找使代码更简洁、更高效的方法。Python的装饰器提供了一种强大的工具,能够让我们做到这一点。本文将深入探讨装饰器的基本概念,展示如何通过它们来增强函数的功能,同时保持代码的整洁性。我们将从基础开始,逐步深入到装饰器的高级用法,让你了解如何利用这一特性来优化你的Python代码。准备好让你的代码变得更加优雅和强大了吗?让我们开始吧!
20 1
|
17天前
|
设计模式 缓存 监控
Python中的装饰器:代码的魔法增强剂
在Python编程中,装饰器是一种强大而灵活的工具,它允许程序员在不修改函数或方法源代码的情况下增加额外的功能。本文将探讨装饰器的定义、工作原理以及如何通过自定义和标准库中的装饰器来优化代码结构和提高开发效率。通过实例演示,我们将深入了解装饰器的应用,包括日志记录、性能测量、事务处理等常见场景。此外,我们还将讨论装饰器的高级用法,如带参数的装饰器和类装饰器,为读者提供全面的装饰器使用指南。
下一篇
无影云桌面