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使用mysqldb连接数据库操作方法示例详解
Dec 03 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
Oct 18 Python
简单了解OpenCV是个什么东西
Nov 10 Python
python实现百万答题自动百度搜索答案
Jan 16 Python
使用python3+xlrd解析Excel的实例
May 04 Python
在pycharm上mongodb配置及可视化设置方法
Nov 30 Python
对python for 文件指定行读写操作详解
Dec 29 Python
django基础学习之send_mail功能
Aug 07 Python
Django项目之Elasticsearch搜索引擎的实例
Aug 21 Python
Python随机函数库random的使用方法详解
Aug 21 Python
基于python修改srt字幕的时间轴
Feb 03 Python
Python 忽略文件名编码的方法
Aug 01 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实现批量查询清除一句话后门的代码
2008/01/20 PHP
ThinkPHP标签制作教程
2014/07/10 PHP
使用基于jquery的gamequery插件做JS乒乓球游戏
2011/07/31 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
推荐 21 款优秀的高性能 Node.js 开发框架
2014/08/18 Javascript
浅谈Javascript中匀速运动的停止条件
2014/12/19 Javascript
原生js的RSA和AES加密解密算法
2016/10/08 Javascript
微信小程序 实现拖拽事件监听实例详解
2016/11/16 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
在Vue中获取组件声明时的name属性方法
2018/09/12 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
使用原生JS实现滚轮翻页效果的示例代码
2020/05/31 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
Python判断变量是否已经定义的方法
2014/08/18 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
python单例模式获取IP代理的方法详解
2018/09/13 Python
使用Python编写Prometheus监控的方法
2018/10/15 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
2019/01/23 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
python根据时间获取周数代码实例
2019/09/30 Python
python中的itertools的使用详解
2020/01/13 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
Python 操作 MySQL数据库
2020/09/18 Python
联想德国官网:Lenovo Germany
2018/07/04 全球购物
英国蜡烛、蜡烛配件和家居香氛购买网站:Yankee Candle
2018/12/12 全球购物
什么是servlet链?
2014/07/13 面试题
高二化学教学反思
2014/01/30 职场文书
幼儿园母亲节活动方案
2014/03/10 职场文书
学习决心书
2014/03/11 职场文书
幼儿教师暑期培训方案
2014/08/27 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
导游词之昭君岛
2020/01/17 职场文书
教你怎么用python爬取爱奇艺热门电影
2021/05/20 Python
一文简单了解MySQL前缀索引
2022/04/03 MySQL
Python加密与解密模块hashlib与hmac
2022/06/05 Python