作用:
在不改变函数源代码的前提下,给函数增加新的功能。
装饰器
1,本质上是一个函数
2,功能---装饰其他函数(为其他函数添加其他功能)
3,不能修改被装饰函数的源代码
4,不能修改被装饰函数的调用方式
实现装饰器的知识储备:
1,函数即“变量”
2,高阶函数
a,把一个函数当作实参,传给另外一个函数(在不修改被装饰函数源代码情况下,为其增加功能)
b,返回值包含函数名(不修改函数的调用方式)
例子:
def bar():
print("this is bar")
def test(func):
print("this is test")----看作是添加的新功能
return func--------------bar其实就是一个内存地址,加上()的时候就能调用。当把bar当作参数传给test的时候,返回的就是bar内存地址。
bar = test(bar)-------------这个操作就相当于:即给了bar一个内存地址使其加上()能调用,且能将test函数里的print内容展示出来
bar()
运行结果:
this is test
this is bar
3,嵌套函数
在函数内部def一个函数。
def test():
print("hahaha")
def bar():
print("bababa")
bar()
test()
运行结果:
hahaha
bababa
高阶函数+嵌套函数 =>装饰器
import time
def timer(func):
def dec(*args,**kwarge):#加上这两个,是预防被装饰的函数带有参数。
start_time = time.time()
func(*args,**kwarge)#加上这两个,是预防被装饰的函数带有参数。
end_time = time.time()
print("pro run time is %s"%(end_time-start_time))
return dec
@timer #等价于 test1 = timer(test1)。timer(test1)这个函数执行结果是返回了 dec的内存地址。-----高阶函数知识点:返回值包含函数名
#其实就是相当于把dec对应的那个内存空间再多加了一个名字“test1”
#而原先的test1的内存空间当作一个参数,传给了timer,并给了个名字func。-----高阶函数知识点:把函数当作实参,传给另外一个函数
def test1():
time.sleep(3)
print("this is test1")
def test2(name):
print("welecome %s"%name)
test1()#所以当执行到这一段的时候,其实是执行的dec(),然后接下来步骤就显而易见了。
test2()
装饰器自己也可以带参数