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 result
    return wrap

@print_log
def say_hello():
    '''
    这是say hello 函数
    :return:
    '''
    print('hello')


if __name__ == '__main__':
    print(say_hello.__name__)
    print(say_hello.__doc__)

image

使用@wrap注解

from functools import wraps


def 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 result
    return wrap

@print_log
def say_hello():
    '''
    这是say hello 函数
    :return:
    '''
    print('hello')


if __name__ == '__main__':
    print(say_hello.__name__)
    print(say_hello.__doc__)

image

 

posted on 2025-12-26 00:23  luckygxf  阅读(0)  评论(0)    收藏  举报

导航