擅长:python、mysql、java
<p>装饰函数应该返回一个函数,因为它返回的任何内容都将绑定到原始函数的名称。因此,如果返回的对象不是函数(或其他可调用的对象,如类构造函数或可调用类实例),则会令人困惑。在</p>
<p>通常返回的函数应该有一个与原始函数兼容的函数签名,但是我想如果返回的函数也需要额外的参数,那就没问题了。另外,返回函数的返回类型应该与原始函数的返回类型兼容。在</p>
<p>修饰函数有点像原始函数的子类,因此遵循<a href="https://en.wikipedia.org/wiki/Liskov_substitution_principle" rel="nofollow noreferrer">Liskov substitution principle</a>是有意义的。在</p>
<p>装饰功能会有副作用:例如,它可以改变某些全局性。这可能是有用的,例如用于日志记录;因此,函数通常应该避免产生副作用。在</p>
<p>FWIW,一些标准函数修饰符返回非函数可调用项,最常见的可能是<code>@classmethod</code>。在</p>
<hr/>
<p>装潢师没有什么特别神奇的。正如Jared Goguen在评论中提到的</p>
<pre><code>@decorator
def some_function(args):
#etc
</code></pre>
<p>与相同</p>
^{pr2}$
<p>第二种形式稍长一些,但功能更强大,因为如果需要,可以选择将返回的函数绑定到其他名称。使用较长语法可以轻松完成的一些事情,如果不是使用<code>@</code>语法完全不可能做到的话,那么这些事情可能会很困难。在</p>