Python装饰器的使用
1、打开Python IDLE,新建一个并保存test.py文件,在test.py中定义几个函数。代码如下:
def fc1():
print ('fc1')
def fc2():
print ('fc2')
fc1()
fc2()
2、运行程序可以看到函数fc1和fc2打印出来的内容,接着定义一个装饰器,完整test.py代码如下:
def decor(fun):
def wrap():
print ('before')
fun()
print ('after')
return wrap
@decor
def fc1():
print ('fc1')
def fc2():
print ('fc2')
fc1()
fc2()
这段代码中decor函数就是装饰器,在fc1函数上方家@decor就是把这个装饰器作用在fc1函数上,fc1函数作为参数传入装饰器内,在decor函数中又通过wrap函数,在fc1函数前后都加了代码,把fc1函数包裹起来,这样执行时候就会按顺序wrap函数中的代码,fc1在中间部分执行。可以看到运行结果如下图
3、下面我们改造一下fc1函数,给fc1函数传递一个参数,这样作用于fc1函数的装饰器decor函数,也要做相应的更改,完整代码如下;
def decor(fun):
def wrap(arg):
print ('before')
fun(arg)
print ('after')
return wrap
@decor
def fc1(arg):
print ('fc1',arg)
def fc2():
print ('fc2')
fc1('testarg')
fc2()
4、fc1参数传入的位置就是是decor函数内部的wrap函数参数。运行程序,可以看到我们传入的参数被正常的打印出来了
5、再高级一点的装饰器,在decor函数外再包一层outter函数,同时传入两个函数作为参数,这两个函数分别在fc1函数的前后执行。具体代码如下,注意这是装饰器为outter,并且要传入两个函数参数。
def outter(before,after):
def decor(fun):
def wrap(arg):
before()
fun(arg)
after()
return wrap
return decor
def before():
print ('new before')
def after():
print ('new after')
@outter(before,after)
def fc1(arg):
print ('fc1',arg)
def fc2():
print ('fc2')
fc1('testarg')
fc2()
6、运行程序可以看到结果正常打印,我们也可以在before和after函数中传递参数,这是它们的参数也要在装饰器的wrap中传递。