All is well 3 idiots

AC小小常

【Python面向对象】(7) 带参数的装饰器

(1)实现简单的带参

"""
带参数的装饰器
"""


def log(name=None):
    """记录函数执行的日志"""
    def decorator(func):
        def wrapper():
            print("{0}.start...".format(name))
       func()
            print("{0}.end...".format(name))return wrapper
    return decorator


@log()
def hello():
    print("hello...")


@log("test")
def test():
    print("test...")
if __name__ == "__main__":
    hello()
    # 输出:
    # None.start...
    # hello...
    # None.end...
    test()
    # 输出:
    # test.start...
    # test...
    # test.end...

 

(2)包含运算的带参

"""
带参数的装饰器
"""


def log(name=None):
    """记录函数执行的日志"""
    def decorator(func):
        # *args表示传入元组类型,**kwargs表示传入字典类型
        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("from add")
def add(a, b, *args, **kwargs):
    return a+b


if __name__ == "__main__":
    result = add(5, 6, k=5, v=6)
    print(result)
    # 输出:
    # from add.start...
    # (5, 6)
    # {'k': 5, 'v': 6}
    # from add.end...
    # 11

 

posted on 2020-04-15 16:27  AC小小常  阅读(203)  评论(0编辑  收藏  举报

导航