主要记录对于装饰器原理的理解

装饰器

装饰器是一种语法糖,使用@符号标识。装饰器有两大特性:1.能把被装饰的函数替换成其他的函数;2.在模块加载时立即执行
装饰器是可调用的对象,其参数是一个函数。装饰器可能会处理被装饰的函数,然后将它返回,比如将被装饰的函数注册到某些数据容器中,方便某一类函数的统一管理;或者将被装饰的函数替换成其他的函数或者可调用对象,比如替换成可以计算函数运行时间的另一个函数,然后被装饰的函数相当于有了一个计时功能。
装饰器不同的应用场景有不用的实现方式。常见的应用场景有:1.注册表/隔离注册表 比如使用celery时,使用的任务注册装饰器;2.记录日志信息;3.捕获异常;4.登陆验证;5.格式化输出 比如视图函数将数据统一转换为json格式;6.参数类型检查。这些场景是我目前做项目常用到的。

闭包

说到装饰器,必然就会涉及到闭包。因为复杂一点的装饰器,是可以在内部的函数体中使用非本地但是存在外部函数体中的非全局变量。这句话有点绕。。。
这就是闭包的起到的作用。

闭包指延伸了作用域的函数,其中包含函数定义体中引用,但是不在定义体中定义的全局变量。

闭包原理:python 在 code 属性(表示编译后的函数定义体)中保存局部变量和自由变量的名称。在__closur__属性中保存的元素与自由变量名称一一对应。