今天学了:
1、带参数的装饰器:
def func1(flag): def fucn2(f) def func3(*args,**kwargs) r = f(*args,**kwargs) return r return func3 return func2 @func1(flag) #此时执行的是1、func1(flag) 2、@func2 def f() pass return Ture flag = w f()
不知道有什么用
课上用的是去掉多个函数的语法糖的问题,是用一个标志位flag。但事实证明不用带参数的装饰器也可以实现
不用的话,用if语句判定flag
用的话,flag写在最外层的函数的参数中
2、多个装饰器装饰一个函数
def wrapper1(func): def inner(): print('wrapper1 ,before func') func() print('wrapper1 ,after func') return inner def wrapper2(func): def inner(): print('wrapper2 ,before func') func() print('wrapper2 ,after func') return inner def wrapper3(func): def inner(): print('wrapper3 ,before func') func() print('wrapper3 ,after func') return inner @wrapper3 @wrapper2 @wrapper1 def f(): print('in f') f()
执行时顺序是 wrapper3的第一句--->wrapper2的第一句--->wrapper1的第一句---> f --->wrapper1的第二句--->wrapper2的第二句--->wrapper3的第二句
原理:执行时先执行离该函数最近的装饰器,此处为wrapper1;
执行wrapper1时,读取内部的inner函数,然后返回,此时的f为wrapper1中的inner(1)
随后执行wrapper2,读取内部的inner函数,然后返回,此时的f为wrapper2中的inner(2)
随后执行wrapper3,读取内部的inner函数,然后返回,此时的f为wrapper3中的inner(3)
然后执行f,因为此时的func为wrapper3中的inner,故先执行inner(3),打印出第一行,遇到了func(),
因为wrapper3中的参数func是wrapper2的inner,所以执行inner(2),打印出第一行,又遇到了func(),
又因为wrapper2中的参数func是wrapper1中的inner,所以执行inner(1),打印出第一行,遇到了func(),
wrapper1中的参数func是函数f,所以此时执行f
执行完毕f,继续走inner(1)下面的部分,打印出inner(1)的第二句,
此时wrapper2中的func()执行完毕,执行下面的部分,打印出inner(2)的第二句,
此时wrapper3中的func()执行完毕,执行下面的部分,打印出inner(3)的第二句,程序执行完毕。
以上7步就是执行的步骤。
随后还有一些小的碎知识点:
_____name_____ 打印函数名
____doc____ 打印函数下的备注