【发布时间】:2016-03-14 09:42:44
【问题描述】:
我在玩装饰器,想出了以下代码。
def first(fn):
def wrapper():
print 'Before First'
fn()
return wrapper
def second(fn):
def wrapper():
print 'Before Second'
fn()
return wrapper
@second
@first
def fn():
print 'The Original Function'
fn()
我得到如下输出
Before Second
Before First
The Original Function
我真的没有收到订单。我在某处读到装饰器以相反的顺序调用,我的意思是首先应该调用第一个,第二个应该调用第二个。但输出表明并非如此。 这里发生了什么事??
【问题讨论】:
-
它们以相反的顺序应用,这使得它们的效果按照你放置它们的顺序被调用。
-
一开始我也很困惑,因为这里链接的示例是重复的。但是仔细分析就清楚了。你有
fn = second(first(fn))然后你打电话。因此,当您应用该链时,它代表来自second函数的wrapper内部函数,因为您上次执行second(semething),它在内部返回wrapper。所以Before Second首先打印。然后fn代表first(fn),这是刚刚执行的函数first中的wrapper。所以Before First打印出来。然后最后fn的主体执行,所以The Original Function打印。