装饰器:
定义:本身是函数,用来装饰其他函数,为其他函数添加附加功能
原则:1、不能修改被装饰的函数的源代码
2、不能修改被装饰的函数的调用方式
实现装饰器知识储备
1、函数即“变量”
2、高阶函数
定义:
1)函数接收的参数是一个函数名
2)函数的返回值是一个函数名
3)满足上述条件的任意一个,都可称之为高阶函数
总结
1)把一个函数名当作实参传给另外一个函数
作用:在不修改被装饰函数源代码的情况下为其添加功能
不足:会改变函数的调用方式
2)返回值中包含函数名
作用:不修改函数的调用方式
不足:不能添加新功能
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#一个最简单的高阶函数: def add(x, y, f): return f(x) + f(y) ''' 当我们调用add(-5, 6, abs)时,参数x,y和f分别接收-5,6和abs,根据函#数定义,我们可以推导计算过程为: x = -5 y = 6 f = abs f(x) + f(y) ==> abs(-5) + abs(6) ==> 11 return 11 用代码验证一下: ''' def add(x, y, f): return f(x) + f(y) print(add(-5, 6, abs))
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def foo(): print('我的函数名作为参数传给高阶函数') def gao_jie1(func): print('我就是高阶函数1,我接收的参数名是%s' %func) func() def gao_jie2(func): print('我就是高阶函数2,我的返回值是%s' %func) return func gao_jie1(foo) gao_jie2(foo)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#高阶函数应用1:把函数当做参数传给高阶函数 import time def foo(): print('from the foo') def timmer(func): start_time=time.time() func() stop_time=time.time() print('函数%s 运行时间是%s' %(func,stop_time-start_time)) timmer(foo) #总结:我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数timmer(foo),改变了函数的调用方式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名 import time def foo(): print('from the foo') def timmer(func): start_time=time.time() return func stop_time=time.time() print('函数%s 运行时间是%s' %(func,stop_time-start_time)) foo=timmer(foo) foo() #总结:我们确实没有改变foo的调用方式,但是我们也没有为foo增加任何新功能
3、嵌套函数
高阶函数+嵌套函数=》装饰器
#函数的调用和嵌套 def foo(): print('in the foo') bar() #此处只是函数的调用,如果有def定义,则是函数的嵌套 def bar(): print('in the bar') foo()
#装饰器代码 def timer(func): def deco(): start_time = time.time() func() stop_time = time.time() print('the func run time is %s'%(stop_time-start_time)) return deco @timer #等同于func1 = timer(func1) def func1(): time.sleep(3) print('in the func1') @timer def func2(): time.sleep(3) print('in the func2') # deco(func1) # deco(func2) #func1 = timer(func1) func1() func2()