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读取图片EXIF信息类库介绍和使用实例
Jul 10 Python
python编写的最短路径算法
Mar 25 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 Python
python logging重复记录日志问题的解决方法
Jul 12 Python
Python实现处理逆波兰表达式示例
Jul 30 Python
在python中实现将一张图片剪切成四份的方法
Dec 05 Python
Python Selenium参数配置方法解析
Jan 19 Python
python读取文件指定行内容实例讲解
Mar 02 Python
Python 3.8 新功能来一波(大部分人都不知道)
Mar 11 Python
Python 解决相对路径问题:"No such file or directory"
Jun 05 Python
Python txt文件常用读写操作代码实例
Aug 03 Python
Python 利用argparse模块实现脚本命令行参数解析
Dec 28 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面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
.htaccess文件保护实例讲解
2011/02/06 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
2015/11/05 PHP
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
CLASS_CONFUSION JS混淆 全源码
2007/12/12 Javascript
JQuery从头学起第二讲
2010/07/04 Javascript
javascript getElementsByTagName
2011/01/31 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
Javascript中的包装类型介绍
2015/04/02 Javascript
详解react-redux插件入门
2018/04/19 Javascript
react 应用多入口配置及实践总结
2018/10/17 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
JS实现排行榜文字向上滚动轮播效果
2019/11/26 Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
2020/08/19 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
python读取csv文件示例(python操作csv)
2014/03/11 Python
Tornado高并发处理方法实例代码
2018/01/15 Python
pytorch实现onehot编码转为普通label标签
2020/01/02 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
2020/06/23 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
Python第三方库安装缓慢的解决方法
2021/02/06 Python
HTML5实现WebSocket协议原理浅析
2014/07/07 HTML / CSS
HTML+CSS+JavaScript实现图片3D展览的示例代码
2020/10/12 HTML / CSS
英国排名第一的在线宠物用品商店:Monster Pet Supplies
2018/05/20 全球购物
英国女鞋购物网站:Moda in Pelle
2019/02/18 全球购物
空字符串(“”)和null的区别
2012/11/13 面试题
大学生物业管理求职信
2013/10/24 职场文书
教师节商场活动方案
2014/02/13 职场文书
咖啡厅商业计划书
2014/09/15 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
2019学子的答谢词范本!
2019/07/05 职场文书
golang在GRPC中设置client的超时时间
2021/04/27 Golang
pyqt5蒙版遮罩mask,setmask的使用
2021/06/11 Python