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中使用装饰器和元编程实现结构体类实例
Jan 28 Python
Python中用sleep()方法操作时间的教程
May 22 Python
Python算法应用实战之栈详解
Feb 04 Python
matplotlib作图添加表格实例代码
Jan 23 Python
python模块之paramiko实例代码
Jan 31 Python
python2.7安装图文教程
Mar 13 Python
对Tensorflow中的变量初始化函数详解
Jul 27 Python
Pandas读写CSV文件的方法示例
Mar 27 Python
Python搭建Spark分布式集群环境
Jul 05 Python
django之从html页面表单获取输入的数据实例
Mar 16 Python
Python semaphore evevt生产者消费者模型原理解析
Mar 18 Python
win10下python3.8的PIL库安装过程
Jun 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
php中配置文件操作 如config.php文件的读取修改等操作
2012/07/07 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
php制作简单模版引擎
2016/04/07 PHP
PHP版微信小店接口开发实例
2016/11/12 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
好好了解一下Cookie(强烈推荐)
2016/06/14 Javascript
使用原生js写ajax实例(推荐)
2017/05/31 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
vue.js实现的绑定class操作示例
2018/07/06 Javascript
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
python如何生成网页验证码
2018/07/28 Python
Django添加feeds功能的示例
2018/08/07 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
python3的数据类型及数据类型转换实例详解
2019/08/20 Python
keras获得model中某一层的某一个Tensor的输出维度教程
2020/01/24 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
美国香薰蜡烛品牌:PADDYWAX
2018/10/06 全球购物
J2EE模式面试题
2016/10/11 面试题
家长对学生的评语
2014/04/18 职场文书
爱护花草树木的标语
2014/06/11 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
春风化雨观后感
2015/06/11 职场文书
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
mybatis中sql语句CDATA标签的用法说明
2021/06/30 Java/Android
PostgreSQL数据库去除重复数据和运算符的基本查询操作
2022/04/12 PostgreSQL
阿里云服务器部署RabbitMQ集群的详细教程
2022/06/01 Servers
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers
Windows server 2016服务器基本设置
2022/08/14 Servers