有人可以告诉我先调用哪个功能,最后调用哪个功能 这里的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)
答案 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} }。
为了解释顺序,我给您提供一个简化示例,其中分别具有名为div
和outer
的函数:
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)
被赋予inner
。 outer
返回函数outer
,其中outer_inner
现在设置为inner_fun
。如果有另一个装饰器(如您的示例中所示),则下一个装饰器将以inner
作为参数来调用。
但是因为没有其他修饰符,所以outer_inner
被用参数outer_inner
调用,该参数输出(1, 2)
并调用函数"outer"
(因为inner
被设置为inner_fun
)。然后函数inner
会显示inner
和两个数字。
因此,通常:首先调用最外层装饰器,然后按其各自的顺序调用内部装饰器。