擅长:python、mysql、java
<p>装饰器只是一个函数,它接受一个函数作为参数并返回另一个函数。接受参数的decorator(比如flask的<code>route</code>decorator)必须返回一个可以用作简单decorator的函数</p>
<p>例如,我们可以这样编写<code>route</code>装饰器:</p>
<pre><code>routes = {}
def route(path):
def inner(func):
global routes
routes[path] = func
return func
return inner
</code></pre>
<p>调用<code>route('/')</code>返回一个以函数为参数的函数,该函数使用传递给外部函数的<code>path</code>值和内部函数接收的<code>func</code>值更新全局<code>routes</code>变量</p>
<p>如果我们在几个函数上使用它:</p>
<pre><code>@route('/')
def func1():
...
@route('/example')
def func2():
...
</code></pre>
<p>然后我们可以检查<code>routes</code>变量,并看到它现在将路径映射到适当的函数。运行:</p>
<pre><code>print(routes)
</code></pre>
<p>产生类似于:</p>
<pre><code>{'/': <function func1 at 0x7f0c4aeac050>, '/example': <function func2 at 0x7f0c4aeb1e60>}
</code></pre>