首页 > 技术文章 > 装饰器修复技术

jhpy 2019-11-01 00:01 原文

@wraps作用,装饰器修复技术啥用?

其实吧,装饰器在实现的时候,被装饰的函数已经是另一个人了,函数名和属性已经发僧改变.

让我们来一探究竟

from functools import wraps


def wrapper(func):
    # @wraps(func)
    def inner(*args, **kwargs):
        print("装饰器工作中...")
        func(*args, **kwargs)
    return inner


@wrapper
def f1(arg):
    """
    这是一个测试装饰器修复技术的函数
    :param arg: 随便传
    :return: 没有
    """
    print(arg)

f1('呵呵')
print(f1.__name__,f1.__doc__) # 函数的名字,和注释

打印结果:

img

可以发现打印的函数的名字和注释都变成了装饰器内部得了...

本来你想要的是被装饰的函数的属性和名字啊,可是被改变了.

那么我们就需要修复装饰器了

form functools import wraps
def wrapper(func):
    @wraps(func)
    def inner(*args, **kwargs):
        print("装饰器工作中...")
        func(*args, **kwargs)
    return inner


@wrapper
def f1(arg):
    """
    这是一个测试装饰器修复技术的函数
    :param arg: 随便传
    :return: 没有
    """
    print(arg)

f1('呵呵')
print(f1.__name__,f1.__doc__)

img

修复完成!!!
总结:
使用:当自定义装饰器的时候一定要从函数工具中导入修复装饰器的工具 from functool import wraps ,使用在装饰其内部
作用及原因:装饰器可以修复被装饰器装饰的函数的名字,以及函数的注释.

推荐阅读