• 被装饰的函数保存元数据


    函数被装饰器装饰后会失去原本的属性和元数据,为了保存原因的元数据,使用functools下的wraps下的装饰器

    未使用装饰器装饰时:

    def mydecorator(fun):
    
        def wrap(*args):
            print 'I am mydecorator'
            fun(*args)
        return wrap()
    
    
    def example():
    
        print 'sdsdsd'
    
    print example.__name__
    print example.__doc__

    运行结果:

    example
    None

    使用装饰器后

    def mydecorator(fun):
    
        def wrap(*args):
            print 'I am mydecorator'
            fun(*args)
        return wrap()
    
    
    @mydecorator
    def example():
    
        print 'sdsdsd'
    
    print example.__name__
    print example.__doc__

    运行结果:name的属性为装饰器的属性

    wrap
    None

    加入装饰器后:

    from functools import update_wrapper, wraps, WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES
    
    
    def mydecorator(func):
        @wraps(func) #使用装饰器,同样有assigned=(),updated=()有默认值WRAPPER_ASSIGNMENTS和 WRAPPER_UPDATES
        def wrap(*args, **kwargs):
            print 'I am mydecorator'
            func(*args, **kwargs)
        '''第一种,保持原来的元组数据'''
        #update_wrapper(wrap, func,assigned=(),updated=()) 这两个assigned=(),updated=()有默认值WRAPPER_ASSIGNMENTS和 WRAPPER_UPDATES
        return wrap
    
    
    @mydecorator
    def example():
    
        print 'sdsdsd'
    
    print example.__name__
    print example.__doc__

    print WRAPPER_ASSIGNMENTS
    print WRAPPER_UPDATES
     

    结果:

    example
    None
    ('__module__', '__name__', '__doc__')
    ('__dict__',)

  • 相关阅读:
    NO OO NO LIFE:OO第二单元总结
    凡为过往,皆是序章——软工全系列个人总结
    Think on 小黄衫
    软工-结对编程作业#3
    你问我答,不亦乐乎——软工案例分析作业
    软工-结对编程作业#2
    软工-结对编程作业#1
    道法之间——软工第2次博客作业
    软工-个人阅读作业#1
    OO_Unit4 UML模型化设计总结
  • 原文地址:https://www.cnblogs.com/misslin/p/6724203.html
Copyright © 2020-2023  润新知