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 相关文章推荐
Python3中常用的处理时间和实现定时任务的方法的介绍
Apr 07 Python
给Python入门者的一些编程建议
Jun 15 Python
Python如何获取系统iops示例代码
Sep 06 Python
python3结合openpyxl库实现excel操作的实例代码
Sep 11 Python
详解Django-auth-ldap 配置方法
Dec 10 Python
详解Python爬取并下载《电影天堂》3千多部电影
Apr 26 Python
python循环嵌套的多种使用方法解析
Nov 29 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
Dec 31 Python
windows下python安装pip方法详解
Feb 10 Python
Pyinstaller打包Scrapy项目的实现步骤
Sep 22 Python
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
May 25 Python
Python数据类型最全知识总结
May 31 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
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
2012/05/16 Javascript
jquery()函数的三种语法介绍
2013/10/09 Javascript
javascript比较两个日期的先后示例代码
2014/12/31 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
Bootstrap富文本组件wysiwyg数据保存到mysql的方法
2016/05/09 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
基于jQuery的左滑出现删除按钮的示例
2017/08/29 jQuery
javascript数据类型中的一些小知识点(推荐)
2019/04/18 Javascript
vuex actions异步修改状态的实例详解
2019/11/06 Javascript
[38:23]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第二场 11.01
2020/11/02 DOTA
Python判断列表是否已排序的各种方法及其性能分析
2016/06/20 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
python+selenium实现京东自动登录及秒杀功能
2017/11/18 Python
python实现堆和索引堆的代码示例
2018/03/19 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
python操作excel文件并输出txt文件的实例
2018/07/10 Python
python实现图片筛选程序
2018/10/24 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
Python Django搭建网站流程图解
2020/06/13 Python
一款简洁的纯css3代码实现的动画导航
2014/10/31 HTML / CSS
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
俄罗斯苹果优质经销商商店:iPort
2020/05/27 全球购物
语文教育专业推荐信范文
2013/11/25 职场文书
食品采购员岗位职责
2014/04/14 职场文书
淘宝好评语大全
2014/05/05 职场文书
学用政策心得体会
2014/09/10 职场文书
医院护士见习期自我鉴定
2014/09/15 职场文书
运动会广播稿200字
2014/10/18 职场文书
布达拉宫导游词
2015/02/02 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js