擅长:python、mysql、java
<p>每个装饰器都可以包装另一个函数。传递给<code>decofu()</code>的函数是<code>decobar()</code>修饰符的结果。在</p>
<p>只要测试<code>decobar</code>包装的特定特征,只要使包装可识别:</p>
<pre><code>def decobar(f):
def wrap():
return f() + "bar"
wrap.decobar = True
return wrap
def decofu(f):
def wrap():
print 'decobar!' if getattr(f, 'decobar') else 'not decobar'
return f() + "fu"
return wrap
</code></pre>
<p>我在wrapper函数上使用了一个任意属性,但是您可以尝试测试名称(不是那么明确)、签名(可能使用<code>inspect.getargspec()</code>)等</p>
<p>这仅限于<em>直接包装</em>。在</p>
<p>一般来说,你不想把装修工像这样紧密地结合在一起。找出一个不同的解决方案,并且只依赖于函数签名或返回值。在</p>