zoukankan      html  css  js  c++  java
  • python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变

    Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring。
    废话不多说,上俩栗子就能搞明白!

    实例一:

    不加wraps

    # -*- coding=utf-8 -*- 
    from functools import wraps   
    def my_decorator(func):
        def wrapper(*args, **kwargs):
            '''decorator'''
            print('Calling decorated function...')
            return func(*args, **kwargs)
        return wrapper  
     
    @my_decorator 
    def example():
        """Docstring""" 
        print('Called example function')
    print(example.__name__, example.__doc__)

    执行结果:

    ('wrapper', 'decorator')
    

      

    实例二:

    加wraps

    # -*- coding=utf-8 -*- 
    from functools import wraps   
    def my_decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            '''decorator'''
            print('Calling decorated function...')
            return func(*args, **kwargs)
        return wrapper  
     
    @my_decorator 
    def example():
        """Docstring""" 
        print('Called example function')
    print(example.__name__, example.__doc__)

    执行结果:

    ('example', 'Docstring')
    

    总结:

    warps 作用: 消除(被装饰后的函数名等属性的改变)副作用

  • 相关阅读:
    软工结对第一次作业
    16061023-软件工程第1次作业
    OO最后一次总结
    OO第三次博客作业
    OO第二次博客作业
    OO第一次博客
    提问回顾与个人总结
    软件工程第一次阅读作业
    test个人博客
    软件工程结对作业
  • 原文地址:https://www.cnblogs.com/liangmingshen/p/10206485.html
Copyright © 2011-2022 走看看