#装饰器:本质就是函数,功能是为其他函数添加附件功能,就是让函数执行前做什么,函数执行后做什么
#原则:
#1 不修改被修饰函数的源代码
#2 不修改被修函数的的调用方式
#装饰器知识储备:
#装饰器=高阶函数+函数嵌套+闭包
# 高阶函数满足下面条件之一就是高阶函数
# 1 把函数当作参数传递给另外一个函数
# 2 返回值值包含函数
#装饰器搞起
import time
def wap(func): #2 func是test函数的内存地址
print(func)
def inter():
start = time.time()
func() #5 func是test函数的内存地址就是执行test函数
end = time.time() - start
print('test运行执行时间为',end)
return inter #3 返回一个函数inter内存地址
@wap
def test():
time.sleep(1)
print('test执行完成')
# res = wap(test) #1 执行wap(test) 把test函数的内存地址传递给 func
# res() #4 rest 是wap 函数返回过来的inter内存地址加上括号就是执行inter函数
#以上是修改了函数的的调用方式
#不修改函数的的调用方式,但是在之前需要做一个赋值操作
# test = wap(test)
# test()
#使用另外一个方式:
#@wap 就相当于执行了test = wap(test)
test()
#加一个返回值的
import time
def wap(func):
print(func)
def inter():
start = time.time()
ret = func() #运行的是test
end = time.time() - start
print('test运行执行时间为',end)
return ret #把运行test的返回值返回
return inter
@wap #test = wap(test)
def test():
time.sleep(1)
print('test执行完成')
return 'test 返回值'
res = test() #运行的是inter
print(res) #结果是test 返回值; 1: 因为test()就是运行inter()函数;inter()函数会运行ret = func() ;也就是运行test()函数,这时候test函数有一个返回值返回给了ret ,2: inter函数运行到最后,也会返回ret给res
import time
def wap(func):
print('wap',func) #func = <function sum at 0x031F3858>
def inner():
start = time.time()
func()
end = time.time() - start
print(end)
return inner #返回给sum
@wap #sum = wap(sum)
def sum():
time.sleep(2)
print('我执行了')
print(sum) #接收 inner内存地址 <function wap.<locals>.inner at 0x012D3780>
sum() #执行inner()
执行结果:
wap <function sum at 0x02B53858>
<function wap.<locals>.inner at 0x02B53780>
我执行了
2.0003716945648193
装饰器传参:
def wap(func):
def inner(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
print(args)
end = time.time() - start
print(end)
return inner
@wap
def sum(name,age):
time.sleep(2)
print('我执行了')
sum('tom',12)
执行结果:
我执行了
('tom', 12)
2.0003695487976074
装饰器上面传参数:
import time
def wanrun(leo='http'):
def wap(func):
def inner(*args,**kwargs):
print(leo)
start = time.time()
func(*args,**kwargs)
print(args)
end = time.time() - start
print(end)
return inner
return wap
@wanrun('测试') #wanrun('测试')等于执行wanrun('测试')这个函数,开始触发函数wanrun执行 ---> wanrun执行就会返回wap函数;所有这个地方最终还是显示@wap ; sum = wap(wanrun)
def sum(name,age):
time.sleep(2)
print('我执行了')
#sum = wap(wanrun) #@wanrun 等于 sum = wap(wanrun) 返回inner
sum('tom',12) ##运行的是inter