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装饰器由浅入深
Dec 09 Python
使用PyV8在Python爬虫中执行js代码
Feb 16 Python
遗传算法之Python实现代码
Oct 10 Python
python使用matplotlib库生成随机漫步图
Aug 27 Python
Python解决两个整数相除只得到整数部分的实例
Nov 10 Python
python模拟登陆,用session维持回话的实例
Dec 27 Python
python从子线程中获得返回值的方法
Jan 30 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
Python 使用list和tuple+条件判断详解
Jul 30 Python
Python socket非阻塞模块应用示例
Sep 12 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
Oct 25 Python
Python中三维坐标空间绘制的实现
Sep 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
如何去掉文章里的 html 语法
2006/10/09 PHP
PHP 巧用数组降低程序的时间复杂度
2010/01/01 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
音乐播放用的的几个函数
2006/09/07 Javascript
几个高效,简洁的字符处理函数
2007/04/12 Javascript
关于可运行代码无法正常执行的使用说明
2010/05/13 Javascript
JS继承 笔记
2011/07/13 Javascript
使用UglifyJS合并/压缩JavaScript的方法
2012/03/07 Javascript
js获取对象为null的解决方法
2013/11/21 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
实例详解jQuery表单验证插件validate
2016/01/18 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
2016/07/12 Javascript
js仿淘宝商品放大预览功能
2017/03/15 Javascript
vue实现简单表格组件实例详解
2017/04/16 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
javascript实现小型区块链功能
2019/04/03 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
vue - vue.config.js中devServer配置方式
2019/10/30 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
jQuery实现容器间的元素拖拽功能
2020/12/01 jQuery
原生JS实现拖拽效果
2020/12/04 Javascript
python 从远程服务器下载东西的代码
2013/02/10 Python
Python数组条件过滤filter函数使用示例
2014/07/22 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
python Pexpect模块的使用
2020/12/25 Python
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
2012/12/13 HTML / CSS
德国鞋子网上商店:Omoda.de
2017/03/31 全球购物
Sisley法国希思黎美国官方网站:享誉全球的奢华植物美容品牌
2020/06/27 全球购物
证婚人搞笑证婚词
2014/01/10 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
python中sqllite插入numpy数组到数据库的实现方法
2021/06/21 Python
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python