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编程中基本的数学计算使用
Feb 04 Python
python基础之入门必看操作
Jul 26 Python
Python基于Socket实现的简单聊天程序示例
Aug 05 Python
python机器学习之神经网络(一)
Dec 20 Python
python随机取list中的元素方法
Apr 08 Python
python输入整条数据分割存入数组的方法
Nov 13 Python
numpy.random.shuffle打乱顺序函数的实现
Sep 10 Python
使用pyqt5 tablewidget 单元格设置正则表达式
Dec 13 Python
python爬虫实现POST request payload形式的请求
Apr 30 Python
PyQt5 QDockWidget控件应用详解
Aug 12 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
Jan 05 Python
利用Selenium添加cookie实现自动登录的示例代码(fofa)
May 08 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
JAVA/JSP学习系列之六
2006/10/09 PHP
PHP优于Node.js的五大理由分享
2012/09/15 PHP
一个PHP针对数字的加密解密类
2014/03/20 PHP
thinkPHP删除前弹出确认框的简单实现方法
2016/05/16 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
JavaScript 空位补零实现代码
2010/02/26 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
TimergliderJS 一个基于jQuery的时间轴插件
2011/12/07 Javascript
ECMAScript 创建自己的js类库
2012/11/22 Javascript
回车直接实现点击某按钮的效果即触发单击事件
2014/02/27 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
2016/07/06 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
Angular 4.x中表单Reactive Forms详解
2017/04/25 Javascript
简单快速的实现js计算器功能
2017/08/17 Javascript
微信小程序模版渲染详解
2018/01/26 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
[06:48]DOTA2-DPC中国联赛2月26日Recap集锦
2021/03/11 DOTA
Python3实现连接SQLite数据库的方法
2014/08/23 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
浅谈Python爬虫基本套路
2019/03/25 Python
python实现kmp算法的实例代码
2019/04/03 Python
Django对models里的objects的使用详解
2019/08/17 Python
python tkinter canvas使用实例
2019/11/04 Python
利用Python自动化操作AutoCAD的实现
2020/04/01 Python
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
英语翻译系毕业生求职信
2013/09/29 职场文书
开办加工厂创业计划书
2014/01/03 职场文书
年度考核自我评价
2014/01/25 职场文书
反四风个人对照检查材料思想汇报
2014/09/25 职场文书
民主生活会剖析材料
2014/09/30 职场文书
网站出售协议书范文
2014/10/10 职场文书
2015元旦标语横幅
2014/12/09 职场文书
小学生勤俭节约倡议书
2015/04/29 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis