python 装饰器
2016-04-09 12:08
267 查看
装饰器本质:为函数附加额外功能。
装饰器虽然最终执行了被装饰函数的内容,但是仅仅是把被装饰函数内容带入到新函数中而已,变成了执行被装饰函数内容的新函数。
对带参数的函数进行装饰分两种:一个是明确函数参数个数的,直接在装饰器里声明同样个数的参数,对于参数数量不确定的则用 不订参数*args,**kwargs声明,函数自己会判断处理.
装饰器不仅可以是函数还可以是类。装饰器装饰的不仅可以是函数也可以是类。
装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
摘录:
总结:【1】@decorator后面不带括号时(也即装饰器无参数时),效果就相当于先定义func或cls,而后执行赋值操作func=decorator(func)或cls=decorator(cls);
【2】@decorator后面带括号时(也即装饰器有参数时),效果就相当于先定义func或cls,而后执行赋值操作 func=decorator(decoratorArgs)(func)或cls=decorator(decoratorArgs)(cls);
【3】如上将func或cls重新赋值后,此时的func或cls也不再是原来定义时的func或cls,而是一个可执行体,你只需要传入参数就可调用,func(args)=>返回值或者输出,cls(args)=>object of cls;
【4】最后通过赋值返回的执行体是多样的,可以是闭包,也可以是外部函数;当被装饰的是一个类时,还可以是类内部方法,函数;
【5】另外要想真正了解装饰器,一定要了解func.func_code.co_varnames,func.func_defaults,通过它们你可以以func的定义之外,还原func的参数列表;另外关键字参数是因为调用而出现的,而不是因为func的定义,func的定义中的用等号连接的只是有默认值的参数,它们并不一定会成为关键字参数,因为你仍然可以按照位置来传递它们。
装饰器虽然最终执行了被装饰函数的内容,但是仅仅是把被装饰函数内容带入到新函数中而已,变成了执行被装饰函数内容的新函数。
对带参数的函数进行装饰分两种:一个是明确函数参数个数的,直接在装饰器里声明同样个数的参数,对于参数数量不确定的则用 不订参数*args,**kwargs声明,函数自己会判断处理.
装饰器不仅可以是函数还可以是类。装饰器装饰的不仅可以是函数也可以是类。
装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
摘录:
总结:【1】@decorator后面不带括号时(也即装饰器无参数时),效果就相当于先定义func或cls,而后执行赋值操作func=decorator(func)或cls=decorator(cls);
【2】@decorator后面带括号时(也即装饰器有参数时),效果就相当于先定义func或cls,而后执行赋值操作 func=decorator(decoratorArgs)(func)或cls=decorator(decoratorArgs)(cls);
【3】如上将func或cls重新赋值后,此时的func或cls也不再是原来定义时的func或cls,而是一个可执行体,你只需要传入参数就可调用,func(args)=>返回值或者输出,cls(args)=>object of cls;
【4】最后通过赋值返回的执行体是多样的,可以是闭包,也可以是外部函数;当被装饰的是一个类时,还可以是类内部方法,函数;
【5】另外要想真正了解装饰器,一定要了解func.func_code.co_varnames,func.func_defaults,通过它们你可以以func的定义之外,还原func的参数列表;另外关键字参数是因为调用而出现的,而不是因为func的定义,func的定义中的用等号连接的只是有默认值的参数,它们并不一定会成为关键字参数,因为你仍然可以按照位置来传递它们。
相关文章推荐
- python之路2
- python 安装numpy,scipy,matplotlib算法库
- python学习笔记(excel+requests)
- python tornado微信开发
- python 学习笔记3(循环方式;list初始化;循环对象/生成器/表推导;函数对象;异常处理)
- Python 练习实例2
- python 分页
- Python之路【第十八篇】Django小项目webQQ实现
- python中if __name__ == '__main__': 的解析
- Counting Bobs!
- python安装paramiko模块
- 在MacOS下Python安装lxml报错xmlversion.h not found 报错的解决方案
- python4.3笔记汇总(图片上不去啊)
- python 断言assert用法
- python中date、datetime、string的相互转换
- Python 练习实例1
- Python开发简单爬虫学习笔记(2)
- Python开发简单爬虫学习笔记(1)
- Mac环境下为Python安装MySQLdb库时遇到的诸多问题
- day22 python学习随笔