被装饰的函数保存元数据

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

原文地址:https://www.cnblogs.com/misslin/p/6724203.html