All is well 3 idiots

AC小小常

【Python面向对象】(8) 装饰器之@wraps

@wraps能保证使用过该装饰器的方法能够拥有它原本的属性,例如__name__之类的
"""
带参数的装饰器
"""
from functools import wraps


def log(name=None):
    """ 记录函数执行的日志 """
    def decorator(func):
        # *args表示传入元组类型,**kwargs表示传入字典类型
        @wraps(func)
        def wrapper(*args, **kwargs):
            """ 装饰器内部的函数 """
            print("{0}.start...".format(name))
            print(args)
            print(kwargs)
            res = func(*args, **kwargs)
            print("{0}.end...".format(name))
            return res
        return wrapper
    return decorator


@log('hello')
def hello():
    """ 简单功能模拟 """
    print("hello...")


if __name__ == "__main__":
    # # 发现输出的都是装饰器的doc和name
    # print("doc:{}".format(hello.__doc__))  # 输出:doc: 装饰器内部的函数
    # print("name:{}".format(hello.__name__))  # 输出:name:wrapper
    # 在装饰器前加了@wraps(func)后,输出原本的doc和name
    print("doc:{}".format(hello.__doc__))  # 输出:doc: 简单功能模拟
    print("name:{}".format(hello.__name__))  # 输出:name:hello
    hello()

 

posted on 2020-04-15 19:08  AC小小常  阅读(221)  评论(0编辑  收藏  举报

导航