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

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

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

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

120647639_1_20180101064033422

正式回答:

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

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

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

120647639_2_20180101064033579

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

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

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

120647639_3_20180101064033672

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

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

120647639_4_20180101064033751

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

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

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

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

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

120647639_5_20180101064033829

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

120647639_6_20180101064033891

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

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

120647639_7_20180101064034110

问得实在太好了!

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

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

120647639_8_20180101064034282

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

以下是2个不同的写法

120647639_9_20180101064034360

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

120647639_10_20180101064034532

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

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

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

120647639_11_20180101064034672

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

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

没有错,我是故意的。

120647639_12_20180101064034766

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

120647639_13_20180101064035391

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值