python @wrap装饰器保留原函数__name__和__doc__属性
不使用@wrap装饰器
def print_log(fn):def wrap(*args, **kwargs):'''这是包装函数:param args::param kwargs::return:'''print("before execute function")result = fn(*args, **kwargs)print("after execute function")return resultreturn wrap@print_log def say_hello():'''这是say hello 函数:return:'''print('hello')if __name__ == '__main__':print(say_hello.__name__)print(say_hello.__doc__)

使用@wrap注解
from functools import wrapsdef print_log(fn):@wraps(fn)def wrap(*args, **kwargs):'''这是包装函数:param args::param kwargs::return:'''print("before execute function")result = fn(*args, **kwargs)print("after execute function")return resultreturn wrap@print_log def say_hello():'''这是say hello 函数:return:'''print('hello')if __name__ == '__main__':print(say_hello.__name__)print(say_hello.__doc__)

Please call me JiangYouDang!