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 内置字符串处理函数的使用方法
Jun 11 Python
Python操作CouchDB数据库简单示例
Mar 10 Python
Python日志模块logging简介
Apr 13 Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
May 11 Python
使用Python简单的实现树莓派的WEB控制
Feb 18 Python
Python Dataframe 指定多列去重、求差集的方法
Jul 10 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
Sep 02 Python
PyQt5实现类似别踩白块游戏
Jan 24 Python
Python叠加两幅栅格图像的实现方法
Jul 05 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
Nov 13 Python
python 用opencv实现霍夫线变换
Nov 27 Python
Python爬虫之Selenium警告框(弹窗)处理
Dec 04 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
第二节--PHP5 的对象模型
2006/11/16 PHP
php cookie 作用范围?不要在当前页面使用你的cookie
2009/03/24 PHP
PHP输入流php://input介绍
2012/09/18 PHP
php遍历目录输出目录及其下的所有文件示例
2014/01/27 PHP
PHP添加Xdebug扩展的方法
2014/02/12 PHP
微信推送功能实现方式图文详解
2019/07/12 PHP
php的单例模式及应用场景详解
2021/02/27 PHP
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
JS+CSS实现电子商务网站导航模板效果代码
2015/09/10 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
详解在React里使用"Vuex"
2018/04/02 Javascript
Angular CLI在Angular项目中如何使用scss详解
2018/04/10 Javascript
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
[36:33]Ti4 循环赛第四日 附加赛NEWBEE vs Mouz
2014/07/13 DOTA
[01:10:02]IG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
Python各类图像库的图片读写方式总结(推荐)
2018/02/23 Python
分享Python切分字符串的一个不错方法
2018/12/14 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
linux环境下Django的安装配置详解
2019/07/22 Python
浅析python内置模块collections
2019/11/15 Python
Python自动化测试基础必备知识点总结
2021/02/07 Python
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
大学生职业生涯规划范文
2014/01/22 职场文书
数控技术应用个人求职信范文
2014/02/03 职场文书
小学语文教研活动总结
2014/07/01 职场文书
2014年财务工作总结范文
2014/11/11 职场文书
小学教师自我评价
2015/03/04 职场文书