一、装饰器简介
本质上是函数,功能是为其他han书添加新功能
1.1、装饰器遵循的原则
- 不修改被装饰函数的源代码(开放封闭原则)
- 为被装饰的添加新功能后,不修改被装饰函数的调用方式
1.2、实现装饰器的知识储备
- 装饰器=高阶函数+函数嵌套+闭包
二、高阶函数
2.1、高阶函数的定义
- 函数接受的是一个函数名
- 函数的返回值是一个函数名
- 满足上述条件的任意一个,都可以被称之为高阶函数
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)
2.2、高阶函数的应用
1)将函数名传递给高阶函数
import time def foo(): time.sleep(3) print('你好') def test(func): # print(func) start_time=time.time() func() stop_time = time.time() print('函数运行时间是 %s' % (stop_time-start_time)) test(foo) 你好 函数运行时间是 3.0009939670562744 #我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数test(foo),改变了函数的调用方式
2)高阶函数返回的是一个函数名
#没有改变函数的调用方式,但多运行了一次,不合格 import time def foo(): time.sleep(3) print('你好') def test(func): # print(func) start_time=time.time() func() stop_time = time.time() print('函数运行时间是 %s' % (stop_time-start_time)) return func foo = test(foo) #此时已经调用了foo,下面又调用了一次 foo() 你好 函数运行时间是 3.000460386276245 你好
3)没有修改被修饰函数的源代码,也没有修改被修饰函数的调用方式,但是也没有为被修饰函数添加新功能
import time def foo(): time.sleep(3) print('来自foo') def timer(func): start_time=time.time() return func stop_time = time.time() print('函数运行时间是 %s' % (stop_time-start_time)) foo=timer(foo) foo() 来自foo