一,什么是装饰器
本质就是函数,功能是为其他函数添加附加功能
原则:
1,不修改被修饰函数的源代码
2,不修改被修饰函数的调用方式
例子:
import time def timmer(func): def wapper(*args, **kwargs): start_time = time.time() res = func(*args, **kwargs) stop_time = time.time() print('函数的运行时间 %s' % (stop_time - start_time)) return res return wapper @timmer #加装饰器 def cal(l): #原函数 res = 0 time.sleep(1) for i in l: res += i return res t1 = cal(range(100)) print(t1) '''输出: 函数的运行时间 1.0000572204589844 4950 '''
二,装饰器的知识储备
装饰器 = 高阶函数 + 函数嵌套 + 闭包
(一)高阶函数
定义:
扫描二维码关注公众号,回复:
5078729 查看本文章
1,函数接受的参数是一个函数名
2,函数的返回值是一个函数名
3,满足上述条件任意一个,都可称之为高阶函数
例子:高阶函数
def foo(): print('你好啊林师傅') def test(func): print(func) #打印内存地址 func() #执行函数foo test(foo) #test是高阶 '''输出: <function foo at 0x00000000022F22F0> 你好啊林师傅 '''
例子:函数接受的参数是一个函数名,就能实现给函数增加功能的目标
def foo(): time.sleep(3) print('你好啊林师傅') def test(func): start_time = time.time() func() #执行函数foo stop_time = time.time() print('函数的运行时间 %s' % (stop_time - start_time)) test(foo) #修改了函数原来的调用方式,原来是foo() '''输出: 你好啊林师傅 函数的运行时间 3.000171661376953 '''
例子:如果再加上返回值是一个函数,则能实现“不修改被修饰函数的调用方式”这一个条件
def foo(): print('from the foo') def test(func): return func # res = test(foo) # print(res) #res得到的是foo的内存地址 # res() #实际是运行foo foo = test(foo) #如果把函数的执行结果重新赋值给foo函数名 foo() #就能实现“不修改被修饰函数的调用方式”这一个条件 '''输出: from the foo '''
例子:多运行一次例子,并不合格(高阶函数并不能全部满足装饰器的需要) 1,不修改foo源代码,2,不修改foo调用方式
def foo(): time.sleep(3) print('from the foo') def timer(func): start_time = time.time() func() #执行函数foo stop_time = time.time() print('函数的运行时间 %s' % (stop_time - start_time)) return func foo = timer(foo) foo() #又执行了一次函数foo '''输出: from the foo 函数的运行时间 3.007171869277954 from the foo '''