装饰器进阶

使用装饰器修复技术wraps

from functools import wraps

def wrapper(func):
    @wraps(func)
    def inner(*args, **kwargs):
        print("在被装饰函数之前要做的事")
        ret = func(*args, **kwargs)
        print("在被装饰函数之后要做的事")
        return ret
    return inner

@wrapper
def test(param):
    print(123)
    return param

ret = test("ABC")
print(ret)
print(test.__name__)  # 结果为test,如果不使用wraps,结果为inner

带参数的装饰器

from functools import wraps

flag = False  # 可以说是控制装饰器是否工作

def wrapper_out(flag):
    def wrapper(func):
        @wraps(func)
        def inner(*args, **kwargs):
            if flag:
                print("在被装饰函数之前要做的事")
                ret = func(*args, **kwargs)
                print("在被装饰函数之后要做的事")
                return ret
            else:
                return func(*args, **kwargs)
        return inner
    return wrapper

@wrapper_out(flag)
def test(param):
    print(123)
    return param

ret = test("ABC")
print(ret)

多个装饰器装饰一个函数

from functools import wraps

def wrapper1(func):
    @wraps(func)
    def inner(*args, **kwargs):
        print("wrapper1:before")
        ret = func(*args, **kwargs)
        print("wrapper1:after")
        return ret
    return inner

def wrapper2(func):
    @wraps(func)
    def inner(*args, **kwargs):
        print("wrapper2:before")
        ret = func(*args, **kwargs)
        print("wrapper2:after")
        return ret
    return inner

@wrapper1
@wrapper2
def test1(param):
    print(123)
    return param

print(test1("ABC"))

 

posted @ 2018-09-01 16:39  就俗人一个  阅读(163)  评论(0编辑  收藏  举报