装饰器没有那么难!(二)

现在取一些网络教程中的例子来看看,是不是感觉很清新了呢。

被封装的函数不带参数

装饰器没有那么难!(二)_第1张图片
装饰器的功能用于计算my_function函数的运行时间
由于my_function前面用了装饰器,
所以print(my_function())
这里的my_function不再是原来的那个函数
而是装饰器里的内部函数wrapper
如果你理解my_function实质上是wrapper函数(核心),
一切都是如此简单

被封装的函数带有参数

装饰器没有那么难!(二)_第2张图片
QQ截图20180423104554.png
装饰器没有那么难!(二)_第3张图片
运行逻辑,看懂红框中的两个关键点就可以了

新内容

1. 保留原函数的属性

被封装的函数,已经不再是原来的函数(说了无数遍了!!!你再理解不了,宝宝也没辙了),
那么要如何保留原函数的属性呢?
python的functools.wraps给我们带来了解决方法
__name__函数名,__doc__注释内容
装饰器没有那么难!(二)_第4张图片
QQ截图20180423175503.png
装饰器没有那么难!(二)_第5张图片
QQ截图20180423175723.png

2. 一个函数使用多个装饰器

1.原则是 “靠近装饰目标函数定义的装饰器先执行,然后依次执行上面的”(重点)
2.一个函数理论上可以使用多个装饰器,但不建议用三个甚至更多,因为太晦涩

装饰器没有那么难!(二)_第6张图片
QQ截图20180423142927.png
运行结果

运行逻辑:
程序先执行decorator2,再执行decorator1
f(3)实际上是g2(3),result2=3,打印'程序在执行2',result2*result2 = 9
g1(9),result1 = 9,打印'程序在执行1',打印9,result1+result1 = 18,打印18

装饰器没有那么难!(二)_第7张图片
QQ截图20180423143227.png

运行逻辑:
程序先执行decorator1,再执行decorator2
f(3)实际上是g1(3),result1=3,打印'程序在执行1',打印3
result1+result1 = 6,
g2(6),result2 = 6,打印'程序在执行2',result2*result2 = 36,打印36

至此装饰器的学习告一段落.

你可能感兴趣的:(装饰器没有那么难!(二))