python装饰器中的@wraps

发布时间:2019-08-02 11:06:39编辑:auto阅读(1134)

    python装饰器中的@wraps

    第一段代码:没有添加@wraps

    def user_login_confirm(name):
        print('我是', name)
        def deco_fun(view_func):
            print('准备变身。。。')
            def wrapper():
                view_func()
                print('变身完成。。。')
            return wrapper
        return deco_fun
    
    @user_login_confirm('小辣椒')
    def tony():
        print('我是', tony.__name__)
    
    tony()

    运行结果:

    我是 小辣椒
    准备变身。。。
    我是 wrapper
    变身完成。。。

    第二段代码:多加一个tony函数

    def user_login_confirm(name):
        print('我是', name)
        def deco_fun(view_func):
            print('准备变身。。。')
            def wrapper():
                view_func()
                print('变身完成。。。')
            return wrapper
        return deco_fun
    
    @user_login_confirm('小辣椒')
    def tony():
        print('我是', tony.__name__)
    
    def tony():
        print('我是', tony.__name__)
    
    tony()

    运行结果:

    我是 小辣椒
    准备变身。。。
    我是 tony

    第三段代码:添加了@wraps

    from functools import wraps
    
    def user_login_confirm(name):
        print('我是', name)
        def deco_fun(view_func):
            print('准备变身。。。')
            @wraps(view_func)
            def wrapper():
                view_func()
                print('变身完成。。。')
            return wrapper
        return deco_fun
    
    @user_login_confirm('小辣椒')
    def tony():
        print('我是', tony.__name__)
    
    tony()

    结论:
    装饰器将被装饰函数变为了wrapper函数,连函数名也变了,通过@wraps(func)可以让函数名变回来。

关键字