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类参数self使用示例
Feb 17 Python
Python实现读取目录所有文件的文件名并保存到txt文件代码
Nov 22 Python
python中self原理实例分析
Apr 30 Python
python使用Apriori算法进行关联性解析
Dec 21 Python
深入了解Python中pop和remove的使用方法
Jan 09 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
May 18 Python
OpenCV 边缘检测
Jul 10 Python
Python时间序列缺失值的处理方法(日期缺失填充)
Aug 11 Python
windows中安装Python3.8.0的实现方法
Nov 19 Python
python3.5的包存放的具体路径
Aug 16 Python
浅析PyCharm 的初始设置(知道)
Oct 12 Python
python异步的ASGI与Fast Api实现
Jul 16 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控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
php设计模式之命令模式使用示例
2014/03/02 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
2017/06/07 PHP
解决laravel session失效的问题
2019/10/14 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
Extjs入门之动态加载树代码
2010/04/09 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
2015/09/09 Javascript
jQuery简单获取DIV和A标签元素位置的方法
2017/02/07 Javascript
通过npm引用的vue组件使用详解
2017/03/02 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
2020/07/28 Javascript
Python基类函数的重载与调用实例分析
2015/01/12 Python
Python实现模拟时钟代码推荐
2015/11/08 Python
详解python之简单主机批量管理工具
2017/01/27 Python
Django日志模块logging的配置详解
2017/02/14 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
python getopt模块使用实例解析
2019/12/18 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
美国创意礼品网站:UncommonGoods
2017/02/03 全球购物
.NET方向面试题
2014/11/20 面试题
关于旷工的检讨书
2014/02/02 职场文书
安全伴我行演讲稿
2014/09/04 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
防汛通知
2015/04/25 职场文书
小学生节水倡议书
2015/04/29 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
学校学习型党组织建设心得体会
2019/06/21 职场文书
学者《孟子》名人名言
2019/08/09 职场文书
Python中字符串对象语法分享
2022/02/24 Python