一、装饰器
装饰器就是用于扩展原来函数功能的一种函数,这个函数特殊之处在于它的返回值也是一个函数,使用Python装饰器的好处在于不更改原函数的代码前提下给函数增加新功能。它经常用于有切面需求场景,如:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计。有了装饰器,我们可以抽离出大量与函数功能本身无关的代码到装饰器并继续使用。总的来说,装饰器的作用就是为已经存在的函数添加额外的功能。
总结一下:
定义:本质是函数,(装饰其他函数)就是为其他函数添加附加的功能。
原则:①不能修改被装饰的函数的源代码; ②不能修改被装饰的函数的调用方式 ;
先看一个简单的小例子,通过小例子加深对装饰器理解:
# -*- coding:utf-8 -*-
import time
def func():
print("I am Python!")
time.sleep(1)
print("Hello,World!")
func() #I am Python! Hello,World!
现在有一个新的需求,希望可以记录下函数的执行时间,那最简单的做法是侵入代码里面修改:
# -*- coding:utf-8 -*-
#修改原始代码,添加记录函数执行时间
import time
def func():
startTime = time.time() #起始时间
print("I am Python!")
time.sleep(1)
print("Hello,World!")
endTime = time.time() #终止时间
t = (endTime - startTime)*1000
print("time is %d ms" %t)
func()
结果:
I am Python!
Hello,World!
time is 1000 ms
如果函数func1()、func2()...也有类似的需求,怎么做?再像上面代码那样写一次?这样会造成大量雷同代码,为减少重复代码,可以这样做,重新定义一个新函数:专门处理时间,处理完时间之后再执行真正业务代码。
# -*- coding:utf-8 -*-
#不直接修改原始代码,添加记录函数执行时间
import time
def deco(func):
startTime = time.time()
func()
endTime = time.time()
t = (endTime - startTime)*1000
print("time is %d ms" %t)
def func():
print("I am Python!")
time.sleep(1)
print("Hello,Wor