装饰器部分:
装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。装饰器可能会处理被装饰的函数,将它返回;或者将其替换成另一个函数或者可调用的对象。
复制代码
1
2
3@decorate def target(): print('running target()')
以上例子,通过装饰器之后,实际执行的是如下方法:
复制代码
1
2
3def target(): print('running target()') target = decorate(target)
这两个写法的最终结果是一样的,从第二个例子可以更直观的感受装饰器的效果。将一个函数作为一个参数,输入到另外一个函数中。接下来我们看一个实际的例子。
复制代码
1
2
3
4def demo(func): def inner(): print('runnging the inner()') return inner #必须返回函数!!!闭包也是,另外会开一篇讲解闭包
复制代码
1
2
3
4
5
6@demo def target(): printing('running the target()') target =target() 打印结果:running inner()
从上面可以看到,执行的是target()函数,如果没有装饰器的情况下,打印的必然是 running target(),但是在装饰器的作用下,打印了running inner。这个过程其实是把target作为一个参数输入到了demo函数,然后顺序执行了inner函数,而非target函数。
Python 装饰器的第二个特性:导入即执行:我们可以看到,当传入target之后,inner函数实际就执行了。
下面再来看一个例子:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21registry = [] def register(func): print('running register(%s)' %func) registry.append(func) return func @register def f1(): print('running f1()') @register def f2(): print('running f2()') def f3(): print('running f3()') def main(): f1() f2() f3()
if __name__ == '__main__':
main()
将该文件作为脚本,import register导入模块,即发现[<running f1 at 0x10061.. running f2 at....],说明了装饰器
在模块导入的时候就能够立即执行,而函数f1,f2(),需要在调用的时候,才能被执行。
最后
以上就是如意凉面最近收集整理的关于Python装饰器原理分析和案例的全部内容,更多相关Python装饰器原理分析和案例内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复