擅长:python、mysql、java
<p>因为您像调用函数一样调用decorator,所以它需要返回另一个实际的decorator函数:</p>
<pre><code>def my_decorator(param):
def actual_decorator(func):
print("Decorating function {}, with parameter {}".format(func.__name__, param))
return function_wrapper(func) # assume we defined a wrapper somewhere
return actual_decorator
</code></pre>
<p>外部函数将得到显式传递的任何参数,并应返回内部函数。内部函数将传递要修饰的函数,并返回已修改的函数。</p>
<p>通常您希望decorator通过将函数包装在包装函数中来更改函数行为。下面是一个在调用函数时可选地添加日志记录的示例:</p>
<pre><code>def log_decorator(log_enabled):
def actual_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
if log_enabled:
print("Calling Function: " + func.__name__)
return func(*args, **kwargs)
return wrapper
return actual_decorator
</code></pre>
<p><code>functools.wraps</code>调用将名称和docstring之类的内容复制到包装器函数,使其更类似于原始函数。</p>
<p>示例用法:</p>
<pre><code>>>> @log_decorator(True)
... def f(x):
... return x+1
...
>>> f(4)
Calling Function: f
5
</code></pre>