装饰器的好处,复用了代码,缺点就是原函数的元信息不见了
比如函数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__)
运行截图如下: