如何在python中使用多个装饰器?

时间:2019-07-19 06:03:36

标签: python python-decorators

有人可以告诉我先调用哪个功能,最后调用哪个功能 这里的inner()函数返回fun(a,b),但是不是执行而是将参数传递给函数iny()。怎么可能?

def deco(fun):
    def inner(a,b):
        if a<b:
            a,b=b,a
        print(a,b)
        return fun(a,b)
    return inner
def smart(fun):
    def iny(a,b):
        a,b=a+1,b+1
        print(a,b)
        return fun(a,b)
    return iny

'''@deco
@smart'''
def div(a,b):
    return a/b
di=deco(smart(div))(4,8)
print(di)

1 个答案:

答案 0 :(得分:1)

您的代码与以下代码基本相同:

def div(a, b):
    return a/b

def smart(a, b):
    a,b=a+1,b+1
    print(a,b)
    return div(a,b)

def deco(a, b):
    if a<b:
        a,b=b,a
    print(a,b)
    return smart(a,b)

di=deco(4,8)
print(di)

在您的代码中,fun中的inner被设置为iny中的smart,而fun中的iny被设置为{{1} }。

为了解释顺序,我给您提供一个简化示例,其中分别具有名为divouter的函数:

inner

这将输出:

def outer(inner_fun):
    def outer_inner(a, b):
        print("outer")
        inner_fun(a, b)
    return outer_inner

@outer
def inner(a, b):
    print("inner")
    print(a, b)

inner(1, 2)

当我们首先呼叫outer inner 1 2 时,inner(1, 2)被赋予innerouter返回函数outer,其中outer_inner现在设置为inner_fun。如果有另一个装饰器(如您的示例中所示),则下一个装饰器将以inner作为参数来调用。 但是因为没有其他修饰符,所以outer_inner被用参数outer_inner调用,该参数输出(1, 2)并调用函数"outer"(因为inner被设置为inner_fun)。然后函数inner会显示inner和两个数字。

因此,通常:首先调用最外层装饰器,然后按其各自的顺序调用内部装饰器。