装饰器的wraps作用

Python中在对函数使用装饰器后,其实被装饰的函数已经变为另一个函数,它的函数名、属性等已发生改变。为了避免这种影响,functools包中提供了wraps来消除这种作用,写定义装饰器时,在前面加上 @wraps(func),它能保留原有函数的名称和docstring。

不加wraps

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’)
[Finished in 0.2s]

加wraps

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’)
[Finished in 0.5s]

猜你喜欢

转载自blog.csdn.net/Evan_Blog/article/details/81974720