Python笔记-函数装饰器的缺点

装饰器的好处,复用了代码,缺点就是原函数的元信息不见了

比如函数docstring、_name_、参数列表

如下代码:

def use_logging(level = "debug"):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print("[%s]  %s is running" % (level, func.__name__))
            return func(*args, **kwargs)
        return wrapper
    return decorator

def bar1():
    print("i am bar1")

def bar2():
    print("i am bar2")

if __name__ == "__main__":
    #这里就是带参数的原形
    f = use_logging(level = "info")(bar1)
    f()
    print(f.__name__)
    print(f.__doc__)

程序运行截图如下:

这里想让他打印bar1。

这里要使用functools

如下代码:

import functools
def use_logging(level = "debug"):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            print("[%s]  %s is running" % (level, func.__name__))
            return func(*args, **kwargs)
        return wrapper
    return decorator

def bar1():
    print("i am bar1")

def bar2():
    print("i am bar2")

if __name__ == "__main__":
    #这里就是带参数的原形
    f = use_logging(level = "info")(bar1)
    f()
    print(f.__name__)
    print(f.__doc__)

运行截图如下:

发布了1269 篇原创文章 · 获赞 1970 · 访问量 179万+

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/104508861