擅长:python、mysql、java
<p>如果您使用包装器函数作为装饰器,它就可以工作。在</p>
<pre><code>def wrap(f):
def wrapped(*args, **kwargs):
print "f was called"
return f(*args, **kwargs)
return wrapped
@wrap
def foo(x):
return foo(x - 1) if x > 0 else 1
</code></pre>
<p>原因是在您的示例中,只调用<code>wrap</code>函数的结果一次。如果您使用它作为装饰器,它实际上会用修饰函数替换模块名称空间中<code>foo</code>的定义,因此它的内部调用解析为包装的版本。在</p>