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