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简单实现基数排序算法
May 16 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
Jul 25 Python
python list元素为tuple时的排序方法
Apr 18 Python
django 自定义过滤器的实现
Feb 26 Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 Python
python+numpy按行求一个二维数组的最大值方法
Jul 09 Python
Django Channels 实现点对点实时聊天和消息推送功能
Jul 17 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
Feb 26 Python
django使用F方法更新一个对象多个对象字段的实现
Mar 28 Python
Python基础之教你怎么在M1系统上使用pandas
May 08 Python
python flappy bird小游戏分步实现流程
Feb 15 Python
Python中非常使用的6种基本变量的操作与技巧
Mar 22 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
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
PHP实现定时执行任务的方法
2014/10/05 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
PHP实现接收二进制流转换成图片的方法
2017/01/10 PHP
php实现简单加入购物车功能
2017/03/07 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
ie focus bug 解决方法
2009/09/03 Javascript
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
基于Jquery easyui 选中特定的tab
2015/11/17 Javascript
基于JQuery实现图片上传预览与删除操作
2016/05/24 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
JS实现HTML页面中动态显示当前时间完整示例
2018/07/30 Javascript
如何给element添加一个抽屉组件的方法步骤
2019/07/14 Javascript
vue滚动tab跟随切换效果
2020/06/29 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
vue实现百度语音合成的实例讲解
2019/10/14 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
用Python解析XML的几种常见方法的介绍
2015/04/09 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
Python facenet进行人脸识别测试过程解析
2019/08/16 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
Django后端分离 使用element-ui文件上传方式
2020/07/12 Python
英国最大的专业户外零售商:Mountain Warehouse
2018/06/06 全球购物
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
2016/02/09 面试题
新闻记者实习自我鉴定
2013/09/19 职场文书
农民入党思想汇报
2014/01/03 职场文书
社区工作者思想汇报
2014/01/13 职场文书
学校卫生检查制度
2014/02/03 职场文书
俄语专业职业生涯规划
2014/02/26 职场文书
80后职场人的职业生涯规划
2014/03/08 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
学生评语集锦
2015/01/04 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
详解Mysq MVCC多版本的并发控制
2022/04/29 MySQL