闭包函数:函数内部定义的函数;引用了外部变量但非全局变量
装饰器:有了闭包的概念再去理解装饰器就会相对容易一些。python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)。装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后的名字;内层函数(闭包)负责修饰被修饰函数。
实质:是一个函数
参数:是你要装饰的函数(并非函数调用)
返回:是装饰完的函数名(也非函数调用)
作用:为已经存在的对象添加额外的功能
特点:不需要对对象做任何代码上的变动
使用装饰器的原因:
开放封闭原则:对扩展是开放的、对修改是封闭的
应用场景:
插入日志、性能测试、事务的处理等等。
装饰器最大的作用就是对于我们已经写好了的程序,我们可以抽离一些雷同的代码然后去组建多个特定功能的装饰器,这样我们就可以针对不同的需求去使用特定的装饰器,这时候源码去除了大量冗余的代码,内容就会变的更加清晰和逻辑化。
必须遵循的两个原则:
1、不改变被装饰对象的源码
2、不改变转世对象的(可调用对象)调用方式
import time def timmer(func): def wrapper(*args, **kwargs): start = time.time() res = func(*args, **kwargs) stop = time.time() print(stop-start) return res return wrapper @timmer def index(name): print('my name is %s' % name) index('william')
装饰器库 -->functools
可是使用functools.wraps()方法来输出原来没有调用装饰器函数之前的函数
多层装饰器:
装饰器在装饰的时候 顺序是从下往上
装饰器在执行的时候 顺序是从上往下