• 技术文章 >后端开发 >Python教程

    python装饰器decorator介绍

    2016-06-06 11:20:09原创746
    一、装饰器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

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:python 装饰器 decorator
    上一篇:python基于queue和threading实现多线程下载实例 下一篇:Python数据结构之Array用法实例
    千万级数据并发解决方案

    相关文章推荐

    • python列表详解(总结分享)• python数据分析之pandas搞定Excel表格• 详细了解Python进程池与进程锁• 一起聊聊Python的编码样式• 带你搞懂Python反序列化
    1/1

    PHP中文网