Python 装饰器浅解
Python装饰器分为两个过程:
一是装饰器装载过程;
二是调用装载后的装饰器过程;
示例:
# @auth: applex
# @date: 2018-10-10
# coding=utf-8
def deco1(func):
print ("deco1 loading!")
def one():
print ('one calling!')
func()
print ('one calling end!')
return one
def deco2(func):
print ("deco2 loading!")
def two():
print('two calling!')
func()
print ('two calling end!')
return two
@deco1
@deco2
def test():
print ('test calling!')
test()
结果
deco2 loading!
deco1 loading!
one calling!
two calling!
test calling!
two calling end!
one calling end!
代码执行过程如下:
解释器遇到装饰函数首先执行装载,相当于执行了test=deco1(deco2(test)):
- 首先执行deco2(test),输出
deco2 loading!
,将deco2的func参数指向test函数,并返回函数two;- 接着执行deco1(two),输出
deco1 loading!
,将deco1的func参数指向two函数,并返回函数one;- 装载完毕后,得到结果 test = one;
- 最后调用test,实际调用函数one,输出
one calling!
;
在函数one中调用函数func,实际调用的是函数two,输出two calling!
;
在函数two中调用函数func,实际调用的是函数test的代码,输出test calling!
;
调用结束后,按调用顺序依次返回two calling end!
,one calling end!
如果注释掉 test()调用,则结果:
deco2 loading!
deco1 loading!
参考博文:
python装饰器详解 1