Skip to main content
 Web开发网 » 编程语言 » Python语言

python中如何理解装饰器代码?

2021年11月26日8010百度已收录

长文预警,【最浅显易懂的装饰器讲解】

能不能专业地复制题目?配上代码,问题分段。

我来给提主配上问题的代码。

python中如何理解装饰器代码?  Python常用代码 第1张

正式回答:

1:如何理解return一个函数,它与return一个值得用法区别在哪?

敲黑板,"python中,一切都是对象"。

值是对象,函数也是对象。

python中如何理解装饰器代码?  Python常用代码 第2张

上图,num是int类的实例对象,funcobj是function类的一个实例对象。

所以返回一个值和返回一个函数并没有什么不同,本质都是返回一个对象。

但是由于值类型和函数类型的使用方法不同,值直接使用,函数需要加上()调用。

python中如何理解装饰器代码?  Python常用代码 第3张

2.在wrapper函数中,为什么能返回一个在wrapper函数中没有定义的func函数?

先更正你的提问,wrapper函数并没有返回func函数,而是返回func函数的运行结果。

python中如何理解装饰器代码?  Python常用代码 第4张

因此,作为参数传递给wrapper函数之后,wrapper当然可以调用func函数。

3.怎么理解在log中作为参数存在的func,在wrapper函数中成了函数?

相信你已经明白用对象的眼光看待,因此和问题2其实是一个问题。

4.这对log函数本身的使用有哪些影响,或者说当A函数的参数是一个函数时,如何使用A函数?

什么是装饰器?装饰器就是装饰函数的!

python中如何理解装饰器代码?  Python常用代码 第5张

问题图中的log函数就是为了在不更改func的情况下,每次调用func之前,都会执行

python中如何理解装饰器代码?  Python常用代码 第6张

想到了什么?日志!没错!

那么,你可能会问,为什么不在func函数print日志呢?

python中如何理解装饰器代码?  Python常用代码 第7张

问得实在太好了!

1:如果func函数是你写的,那么你当然可以这么做;如果不是你写的,你这么做试试?

比如在系统open函数的最前面加上print()....

python中如何理解装饰器代码?  Python常用代码 第8张

2:如果你有n个函数,在执行的前后都会执行一些类似的代码。

以下是2个不同的写法

python中如何理解装饰器代码?  Python常用代码 第9张

显然右边代码量更少,更容易维护,但是还有更好的写法。

python中如何理解装饰器代码?  Python常用代码 第10张

请注意,不修改add函数和sub函数的情况下,就为这2个不同的函数的执行前后增加了新的功能。

把add函数和sub函数装饰得更强大了。

上述代码后半段仍有改进的空间。

python中如何理解装饰器代码?  Python常用代码 第11张

看,经过@decorator装饰add和sub函数之后,使用时更方便了。

细心的朋友,相信已经注意到了add函数和sub函数的参数不一样的。

没有错,我是故意的。

python中如何理解装饰器代码?  Python常用代码 第12张

奥妙在于*args 和**kwgs,可变参数。

python中如何理解装饰器代码?  Python常用代码 第13张

上图是对指定参数、可变参数*args、可变**kwgs的示例。

对于装饰器来说,不需要指定参数,因此只需*args和**kwgs即可以表示。

如果对你有帮助,请点赞支持。

评论列表暂无评论
发表评论
微信