一, 什么是装饰器
本质就是函数, 功能是为其他函数添加附加功能
原则:
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
- '''
二, 装饰器的知识储备
装饰器 = 高阶函数 + 函数嵌套 + 闭包
(一) 高阶函数
定义:
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
- '''
来源: http://www.bubuko.com/infodetail-2934549.html