zoukankan      html  css  js  c++  java
  • 被装饰的函数保存元数据

    函数被装饰器装饰后会失去原本的属性和元数据,为了保存原因的元数据,使用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__',)

  • 相关阅读:
    bashrc的加载
    无奈卸载Clover 转投TotalCommand
    Hash Table Benchmarks
    linux下编译lua
    可变参数的传递问题
    vector 之 find 重载
    Shell统计报表表格生成
    Shell字符串使用十进制转换
    No module named BeautifulSoup
    Multi Thread.
  • 原文地址:https://www.cnblogs.com/misslin/p/6724203.html
Copyright © 2011-2022 走看看