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 07 Python
Python用UUID库生成唯一ID的方法示例
Dec 15 Python
Python numpy生成矩阵、串联矩阵代码分享
Dec 04 Python
Python 从相对路径下import的方法
Dec 04 Python
python 多线程重启方法
Feb 18 Python
Django框架orM与自定义SQL语句混合事务控制操作
Jun 27 Python
Django组件content-type使用方法详解
Jul 19 Python
python实现可下载音乐的音乐播放器
Feb 25 Python
keras topN显示,自编写代码案例
Jul 03 Python
pycharm专业版远程登录服务器的详细教程
Sep 15 Python
python 中 .py文件 转 .pyd文件的操作
Mar 04 Python
发工资啦!教你用Python实现邮箱自动群发工资条
May 10 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
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
php字符串截取函数用法分析
2014/11/25 PHP
php调用mysql存储过程实例分析
2014/12/29 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
2019/10/11 PHP
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
javascript操纵OGNL标签示例代码
2014/06/16 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
jquery中val()方法是从最后一个选项往前读取的
2015/09/06 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
2016/07/07 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
2019/04/14 Javascript
Vue使用screenfull实现全屏效果
2020/09/17 Javascript
使用Python操作MySQL的一些基本方法
2015/08/16 Python
Tensorflow之Saver的用法详解
2018/04/23 Python
python实战之实现excel读取、统计、写入的示例讲解
2018/05/02 Python
检测浏览器是否支持html5视频的代码
2013/03/28 HTML / CSS
Canvas获取视频第一帧缩略图的实现
2020/11/11 HTML / CSS
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
行政经理岗位职责
2013/11/09 职场文书
教师实习自我鉴定
2013/12/18 职场文书
读书活动实施方案
2014/03/10 职场文书
建筑专业毕业生自荐信
2014/05/25 职场文书
手术室护士节演讲稿
2014/08/27 职场文书
本科毕业答辩开场白
2015/05/27 职场文书
学长教您写论文:经验总结
2019/07/09 职场文书
Python 数据科学 Matplotlib图库详解
2021/07/07 Python
vue elementUI批量上传文件
2022/04/26 Vue.js