高阶函数的两种情况:
1、
把一个函数名当成实参传给另外一个函数(在不修改被装饰函数源代码的情况下,为其添加功能)
import time
def bar():
time.sleep(2)
print(‘in the bar‘)
def test1(fun_name):
t1 = time.time()
fun_name()
print(‘run time:%s‘%(time.time()-t1))
test1(bar)
2、
返回值中包含函数名(不修改调用方式)
import time
def bar():
time.sleep(2)
print(‘in the bar‘)
def test1(fun_name):
return fun_name
bar = test1(bar)
bar()
高阶函数+嵌套函数则得到装饰器
import time
def timer(fun_name):
def deco():
start_time = time.time()
fun_name()
end_time = time.time()
print(‘running time:%s‘ % (end_time - start_time))
return deco
def bar():
time.sleep(2)
print(‘in the bar‘)
bar = timer(bar)
bar()
但我们一般把装饰器在被装饰函数前面定义,并且用如下的写法代替:
import time
def timer(fun_name):
def deco():
start_time = time.time()
fun_name() # 在这里调用是bar()这个函数
end_time = time.time()
print(‘running time:%s‘ % (end_time - start_time))
return deco
@timer # bar = timer(bar) 这步其实是调用了timer()这个函数,把bar这个函数进行重新定义
def bar():
time.sleep(2)
print(‘in the bar‘)
bar() # 在调用bar的时候,其实调用的是deco()这个函数
可以理解为,先用第一种高阶函数加上想要的功能,再重新覆盖定义这个函数,再用函数嵌套,就得到了我们想要的装饰器的效果
如果有参数:
import time
def timer(fun_name):
def deco(*args,**kwargs):
start_time = time.time()
fun_name(*args,**kwargs)
end_time = time.time()
print(‘running time:%s‘ % (end_time - start_time))
return deco
@timer # bar = timer(bar)
def bar():
time.sleep(2)
print(‘in the bar‘)
@timer
def bar2(name,age):
print(name,age)
bar()
bar2(‘simon‘,22)
原文:https://www.cnblogs.com/Simonsun002/p/8747473.html