装饰器
在不改变原函数的情况下,为原来的函数加上一个验证:
def w1(func):
def inner():
print("-----inner-----")
func()
return inner
def f1():
print("---f1---")
def f2():
print("---f2---")
f1=w1(f1)
f1()
利用闭包的方式,将要调用的函数作为参数传进去
1.装饰器
def w1(func):
def inner():
print("-----inner-----")
func()
return inner
@w1
def f1():
print("---f1---")
@w1
def f2():
print("---f2---")
f1()
f2()
加上了@w1之后,相当于原来的f1=w1(f1)
#定义函数:完成包裹数据
def makeBold(fn):
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped
#定义函数:完成包裹数据
def makeItalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped
@makeBold
def test1():
return "hello world-1"
@makeItalic
def test2():
return "hello world-2"
@makeBold
@makeItalic
def test3():
return "hello world-3"
print(test1()))
print(test2()))
print(test3()))
运行结果:
<b>hello world-1</b>
<i>hello world-2</i>
<b><i>hello world-3</i></b>
2.装饰器执行时间
测试代码:
def w1(func):
print("----w1----")
def inner():
print("-----inner-----")
func()
return inner
#只要Python解释器执行到这个代码,那么就会自动进行装饰,而不是等到调用的时候才装饰的
@w1
def f1():
print("---f1---")
@w1
def f2():
print("---f2---")
#在调用f1之前已经进行装饰了
f1()
f2()
3.装饰器对有参数的函数进行装饰
4.装饰器对不定长的参数的函数进行装饰
利用*args 和**kwargs
5. 有返回值的参数的函数装饰器
def w1(func):
print("----w1----")
def inner():
print("-----inner-----")
temp=func()
return temp
return inner
@w1
def f1():
print("---f1---")
return "shushu"
print(f1())
6.通用装饰器
def w1(func):
def inner(*args,**kwargs):
print("-----inner-----")
temp=func(*args,**kwargs)
return temp
return inner
7.装饰器带参数
可以根据装饰器的参数不同,后面执行不同的步骤
def y1(arg):
def w1(func):
def inner(*args,**kwargs):
print("-----inner-----:%s"%arg)
if(arg=="f1_test"):#针对参数不同,执行不同后续步骤
print("----f1_test----")
temp=func(*args,**kwargs)
else:
print("----other-----")
temp=func(*args,**kwargs)
return temp
return inner
return w1
#1.先执行y1("f1_test")函数,这个函数return的结果是w1这个函数的引用
#2.@w1
#3.使用@w1对f1进行装饰
@y1("f1_test")
def f1():
print("---f1---")
f1()
@y1("f2_test")
def f2():
print("---f2---")
f2()