装饰器:本质就是函数,用来给其他函数增加 附加功能
原则:
1.不修改被修饰函数的源代码
2.不修改被修饰函数的调用方式
装饰器 = 高阶函数 + 函数嵌套 +闭包
高阶函数:
1.函数的参数是一个函数名
2.函数的返回值是一个函数名
3.满足以上两个条件中的一个就是高阶函数
import time def foo(): time.sleep(2) def test_swapper(func): time_start = time.time() func() time_end = time.time() print('函数执行时间:%s' %(time_end - time_start)) test_swapper(foo) # 修改了函数的调用方式 foo() ''' 函数执行时间:2.0000498294830322 '''
import time def foo(): time.sleep(2) print('from foo...') def test_swapper(func): time_start = time.time() func() time_end = time.time() print('函数执行时间:%s' %(time_end - time_start)) return func foo = test_swapper(foo) foo() ''' from foo... 函数执行时间:2.0009238719940186 from foo... # 多执行了一次 '''
以上说明高阶函数一个人满足不了装饰器的条件
函数嵌套
函数闭包