defa_decorator(func): defwrapper(*args, **kwargs): """A wrapper function""" # do something here, or do some changes on params func(*args, **kwargs) # do something here return wrapper
使用方法:
1 2 3 4
@a_decorator deffirst_function(): """This is docstring for first function""" print("first function")
但是这样的装饰器是不完美的,如果有 log 打印或者其他一些关于方法的需求,如
1 2 3 4 5
print(first_function.__name__) print(first_function.__doc__) # result blow # wrapper # A wrapper function
此时的打印的是装饰器的属性,这样可以预想是很不利于实际使用过程中的调试或者日志记录的。
我们手动赋值可以解决这个麻烦:
1 2 3 4 5 6 7 8 9
defa_decorator(func): defwrapper(*args, **kwargs): """A wrapper function""" # do something here, or do some changes on params func(*args, **kwargs) wrapper.__name__ = func.__name__ wrapper.__doc__ = func.__doc__ # do something here return wrapper
或者使用 @wraps 装饰器也同样可以做到
1 2 3 4 5 6 7 8 9
from functools import wraps defa_decorator(func): @wraps(func) defwrapper(*args, **kwargs): """A wrapper function""" # do something here, or do some changes on params func(*args, **kwargs) # do something here return wrapper