擅长:python、mysql、java
<p>要理解装饰器的有用性,最简单的方法就是看一些例子。举个例子来说:</p>
<p>你想学习一些代码
了解函数的调用时间和方式。
可以使用修饰符来更改函数
因此每次调用函数时,它都会打印一些调试信息:</p>
<pre><code>import functools
def trace(f):
'''This decorator shows how the function was called'''
@functools.wraps(f)
def wrapper(*arg,**kw):
arg_str=','.join(['%r'%a for a in arg]+['%s=%s'%(key,kw[key]) for key in kw])
print "%s(%s)" % (f.__name__, arg_str)
return f(*arg, **kw)
return wrapper
@trace
def foo(*args):
pass
for n in range(3):
foo(n)
</code></pre>
<p>印刷品:</p>
^{pr2}$
<p>如果您只想跟踪一个函数<code>foo</code>,当然可以
将代码更简单地添加到<code>foo</code>的定义中:</p>
<pre><code>def foo(*args):
print('foo({0})'.format(args))
</code></pre>
<p>但是如果你有很多你想追踪的函数,或者
不想搞乱原来的代码,那就装潢吧
变得有用。在</p>
<p>有关有用的装饰器的其他示例,请参见<a href="http://wiki.python.org/moin/PythonDecoratorLibrary" rel="nofollow noreferrer">the decorator library</a>。在</p>