一、高阶函数
函数只要有以下两个特征中一个就可以称为高阶函数:
a:函数名作为一个实参传入另一个函数中
b:函数的返回值中包含函数名
下面我们用代码来感受一下这两种形式:
import time # 通过高阶函数将函数名作为参数传入,在不改变函数源代码的情况下为其添加功能 def bar(): time.sleep(3) print("in the bar") def test1(func): start_time = time.time() func() end_time = time.time() print("in the function the cost time is :%s"%(end_time-start_time)) test1(bar)
将函数名作为一个参数传入,这样就可以实现不修改函数源代码的情况下为其增加功能。
def bar(): time.sleep(3) print("in the bar") def test2(func): print(func) return func bar = test2(bar) bar()
返回值中包含函数名,这样就可以实现不修改函数的调用方式
以上两点非常重要,是我们在接下来要将的装饰器能够实现的原理。
二、装饰器
在搞清楚以上两个高阶函数的形式和可以实现的功能之后,我们就可以在此基础上实现装饰器。
装饰器为了实现以下两个目的,一方面为已有的函数增加新的功能,另一方面要不改变函数的调用的方式。
import time def timer(func): #timer(test1) func = test1 def wrapper(*args,**kwargs): #这里加了*args和**kwargs就可以不限制被修饰参数的类型了 start_time = time.time() func(*args,**kwargs) stop_time = time.time() print("the function runing time is %s"%(stop_time-start_time)) return wrapper @timer # test1 = timer(test1) =deco def test1(): time.sleep(3) print("in the test 1") #print(timer(test1)) 打印deco的内存地址 test1() #实际上在执行deco