4

我不知道是否“嵌套 python 装饰器”?是陈述这个问题的正确方式,所以如果不是,请告诉我。

无论如何,我正在 udacity 上一堂课,刚刚遇到了一些涉及 python 装饰器的代码,看起来像巫术魔法,所以现在我想问一个普遍的问题,看看我是否能弄清楚那个代码。

假设我有以下代码:

def A(f):
    print 'blah'
    return f

@A
def B(f):
    return f

@B
def C():
    pass

现在,我从上面的代码中了解到,装饰器导致 B 变成:

B = A(B)

这就是装饰师所做的。然而,C 是什么样的?从我看到的一些小示例代码中,不知何故 C 受到 A 的影响,因为 A 改变了 B,B 改变了 C。但我在理解这一点上有两个问题:

  1. C的确切性质。是C = A(B)(C)还是C = A(B(C))
  2. 如果 C 确实受 A 影响,为什么在我运行上述代码时只打印一次“blah”?

个人猜测

实际上,既然我已经把它打出来了,我假设发生的事情是我们首先得到 B = A(B)然后. 这意味着总体而言,我们得到,它可以解释为什么 'blah' 只打印一次。 C = B(C)C = A(B)(C)

但最好是我确定。

4

1 回答 1

6

你的个人猜测是正确的。

装饰器在定义时被“调用”,当@-line 及其后面的函数定义被评估时。

@foo
def bar():
    pass

只是...的语法糖

def bar():
    pass
bar = foo(bar)
于 2012-06-27T03:58:16.493 回答