其他分享
首页 > 其他分享> > 十二、装饰器 3.装饰器的参数和返回值

十二、装饰器 3.装饰器的参数和返回值

作者:互联网

装饰器的参数和返回值

如果装饰带有参数的函数,需要在装饰器的内函数中定义形参,并传递给内函数中调用的函数
如果装饰器需要有参数,那么在定义装饰器函数的时候要在最外层再嵌套一个函数用于接收该参数,该参数可以在装饰器内层使用
装饰后原函数名被内层函数名覆盖,原return也会失效,所以需要在覆盖(赋值)前获取原return内容,并在内层函数中再次return

# 定义最外层函数接收装饰器的参数
def outer(var):
    print(var)
    def testA(f):
        # 装饰器中使用最外层函数接收的参数
        print(f'testA recv : {var}')
        # 装饰器接收与原函数相同的参数
        def inner1(var1, var2, var3, *args, **kwargs):
            print(f'testA1 : {var1},{var2},{var3}')
            # res_inner等同于原函数return的内容,装饰后的新函数接收原函数return的内容并再次return
            res_inner = f(var1, var2, var3, *args, **kwargs)
            return res_inner

        def inner2(var1, var2, var3, *args, **kwargs):
            print(f'testA2 : {args},{kwargs}')
            f(var1, var2, var3, *args, **kwargs)

        # 使用装饰器的参数实现流程控制
        if var == 1:
            return inner1
        else:
            return inner2
    # 返回装饰器testA
    return testA

# 带有参数的装饰器
@outer(1)    # 带有参数的装饰器语法分解为以下两步
# @outer(1) --> return testA
# @第一步的结果(testA) --> @testA
# 多参数的原函数
def demo(x, y, Func, *args, **kwargs):
    print(Func([x, y]))
    print(args)
    print(kwargs)
    # 原函数被装饰后的新函数覆盖,所以原函数中的return会失效,需要把return的内容转移到新函数中
    return x,y

res = demo(2, 8, sum, 'nono', 'nono', kw1=100, kw2=200)  # 等同于 inner(x,y,Func,*args,**kwargs)
print(res)



# 定义最外层函数接收装饰器的参数
def outer(var):
    print(var)
    def testA(f):
        # 装饰器中使用最外层函数接收的参数
        print(f'testA recv : {var}')
        # 装饰器接收与原函数相同的参数
        def inner1(var1, var2, var3, *args, **kwargs):
            print(f'testA1 : {var1},{var2},{var3}')
            # res_inner等同于原函数return的内容,装饰后的新函数接收原函数return的内容并再次return
            res_inner = f(var1, var2, var3, *args, **kwargs)
            return res_inner

        def inner2(var1, var2, var3, *args, **kwargs):
            print(f'testA2 : {args},{kwargs}')
            f(var1, var2, var3, *args, **kwargs)

        # 使用装饰器的参数实现流程控制
        if var == 1:
            return inner1
        else:
            return inner2
    # 返回装饰器testA
    return testA

# 带有参数的装饰器
@outer(1)    # 带有参数的装饰器语法分解为以下两步
# @outer(1) --> return testA
# @第一步的结果(testA) --> @testA
# 多参数的原函数
def demo(x, y, Func, *args, **kwargs):
    print(Func([x, y]))
    print(args)
    print(kwargs)
    # 原函数被装饰后的新函数覆盖,所以原函数中的return会失效,需要把return的内容转移到新函数中
    return x,y

res = demo(2, 8, sum, 'nono', 'nono', kw1=100, kw2=200)  # 等同于 inner(x,y,Func,*args,**kwargs)
print(res)




1
testA recv : 1
testA1 : 2,8,<built-in function sum>
10
('nono', 'nono')
{'kw1': 100, 'kw2': 200}
(2, 8)

标签:return,args,十二,testA,kwargs,print,返回值,装饰
来源: https://www.cnblogs.com/HyeJeong/p/15690876.html