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中Collections模块的Counter容器类使用教程
May 31 Python
python中import学习备忘笔记
Jan 24 Python
Python打印输出数组中全部元素
Mar 13 Python
对IPython交互模式下的退出方法详解
Feb 16 Python
opencv导入头文件时报错#include的解决方法
Jul 31 Python
Python利用requests模块下载图片实例代码
Aug 12 Python
Python面向对象之多态原理与用法案例分析
Dec 30 Python
pytorch实现Tensor变量之间的转换
Feb 17 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
Jul 20 Python
python em算法的实现
Oct 03 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
Mar 02 Python
Python机器学习应用之基于线性判别模型的分类篇详解
Jan 18 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生成便于打印的网页
2006/10/09 PHP
jquery isType() 类型判断代码
2011/02/14 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
2013/11/19 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
简单实现js轮播图效果
2017/07/14 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
JS实现头条新闻的经典轮播图效果示例
2019/01/30 Javascript
Vue解析剪切板图片并实现发送功能
2020/02/04 Javascript
微信小程序后端实现授权登录
2020/02/24 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
vue+node 实现视频在线播放的实例代码
2020/10/19 Javascript
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
python快速编写单行注释多行注释的方法
2019/07/31 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
Python版中国省市经纬度
2020/02/11 Python
Python爬虫爬取杭州24时温度并展示操作示例
2020/03/27 Python
python 3.8.3 安装配置图文教程
2020/05/21 Python
Python selenium爬取微博数据代码实例
2020/05/22 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
Python中的面向接口编程示例详解
2021/01/17 Python
美国知名的女性服饰品牌:LOFT(洛芙特)
2016/08/05 全球购物
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
银行出纳岗位职责
2013/11/25 职场文书
新闻专业个人求职信
2013/12/19 职场文书
眼镜促销方案
2014/03/15 职场文书
个人担保书范文
2014/05/20 职场文书
入党综合考察材料
2014/06/02 职场文书
紫日观后感
2015/06/05 职场文书
五一放假通知怎么写
2015/08/18 职场文书
python爬不同图片分别保存在不同文件夹中的实现
2021/04/02 Python
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript
Android超详细讲解组件ScrollView的使用
2022/03/31 Java/Android