python装饰器decorator介绍


Posted in Python onNovember 21, 2014

一、装饰器decorator

decorator设计模式允许动态地对现有的对象或函数包装以至于修改现有的职责和行为,简单地讲用来动态地扩展现有的功能。其实也就是其他语言中的AOP的概念,将对象或函数的真正功能也其他辅助的功能的分离。

二、Python中的decorator

python中的decorator通常为输入一个函数,经过装饰后返回另一个函数。  比较常用的功能一般使用decorator来实现,例如python自带的staticmethod和classmethod。

装饰器有两种形式:

@A

def foo():

    pass

相当于:

def foo():

    pass

foo = A(foo)

第二种为带参数的:

@A(arg)

def foo():

    pass

则相当于:

def foo():

    pass

foo = A(arg)(foo)

可以看出第一种的装饰器是个返回函数的函数,第二种的装饰器是个返回函数的函数的函数。

python中的decorator可以多个同时使用,如下:

@A

@B

@C

def f (): pass

    

# it is same as below

def f(): pass

f = A(B(C(f)))

三、Python中常用的decorator实例

decorator通常用来在执行前进行权限认证,日志记录,甚至修改传入参数,或者在执行后对返回结果进行预处理,甚至可以截断函数的执行等等。

实例1:

from functools import wraps

def logged(func):

    @wraps(func)

    def with_logging(*args, **kwargs):

        print (func.__name__() + " was called")

        return func(*args, **kwargs)

    return with_logging
@logged

def f(x):

   """does some math"""

   return x + x * x
print (f.__name__)  # prints 'f'

print (f.__doc__)   # prints 'does some math'

注意functools.wraps()函数的作用:调用经过装饰的函数,相当于调用一个新函数,那查看函数参数,注释,甚至函数名的时候,就只能看到装饰器的相关信息,被包装函数的信息被丢掉了。而wraps则可以帮你转移这些信息,参见http://stackoverflow.com/questions/308999/what-does-functools-wraps-do

Python 相关文章推荐
用python代码做configure文件
Jul 20 Python
Python multiprocessing模块中的Pipe管道使用实例
Apr 11 Python
浅谈Django自定义模板标签template_tags的用处
Dec 20 Python
快速解决pandas.read_csv()乱码的问题
Jun 15 Python
python3安装speech语音模块的方法
Dec 24 Python
Python中的异常处理try/except/finally/raise用法分析
Feb 28 Python
Python选择网卡发包及接收数据包
Apr 04 Python
Django ORM 常用字段与不常用字段汇总
Aug 09 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
python 导入数据及作图的实现
Dec 03 Python
Django User 模块之 AbstractUser 扩展详解
Mar 11 Python
Python如何实现远程方法调用
Aug 07 Python
python多线程操作实例
Nov 21 #Python
Python中的闭包详细介绍和实例
Nov 21 #Python
Python多线程同步Lock、RLock、Semaphore、Event实例
Nov 21 #Python
python多进程操作实例
Nov 21 #Python
Python多进程通信Queue、Pipe、Value、Array实例
Nov 21 #Python
Python多进程同步Lock、Semaphore、Event实例
Nov 21 #Python
Python multiprocessing.Manager介绍和实例(进程间共享数据)
Nov 21 #Python
You might like
深入PHP empty(),isset(),is_null()的实例测试详解
2013/06/06 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
php提交表单发送邮件的方法
2015/03/20 PHP
php实现XML和数组的相互转化功能示例
2017/02/08 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
在IE浏览器中resize事件执行多次的解决方法
2011/07/12 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
JavaScript电子时钟倒计时第二款
2016/01/10 Javascript
jQuery的ajax下载blob文件
2016/07/21 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
TensorFLow用Saver保存和恢复变量
2018/03/10 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
Python如何筛选序列中的元素的方法实现
2019/07/15 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
Python 操作 MySQL数据库
2020/09/18 Python
什么是java序列化,如何实现java序列化
2012/11/14 面试题
大专毕业生自我鉴定
2013/11/21 职场文书
自荐信封面
2013/12/04 职场文书
计算机专业优秀大学生自我总结
2014/01/21 职场文书
我的理想演讲稿
2014/04/30 职场文书
教师政风行风自查自纠报告
2014/10/21 职场文书
运动会跳远广播稿
2015/08/19 职场文书
七年级语文教学反思
2016/03/03 职场文书
担保书怎么写 ?
2019/04/22 职场文书
TensorFlow的自动求导原理分析
2021/05/26 Python
MySQL为id选择合适的数据类型
2021/06/07 MySQL
Node实现搜索框进行模糊查询
2021/06/28 Javascript
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript
Java 定时任务技术趋势简介
2022/05/04 Java/Android