【问题标题】:How decorators chaining work? [duplicate]装饰器链接如何工作? [复制]
【发布时间】: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 打印。

标签: python decorator


【解决方案1】:

您从原始功能开始。然后上去。想象一下:second(first(fn))。

this answer中查看更多信息

【讨论】:

    猜你喜欢
    • 2014-04-14
    • 1970-01-01
    • 2017-12-28
    • 2018-01-20
    • 2018-05-30
    相关资源
    最近更新 更多