第十二天
2018-04-02 12:02 dalao说得对 阅读(140) 评论(0) 收藏 举报今天学了:
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____ 打印函数下的备注
浙公网安备 33010602011771号