<h2>实例方法<code>classmethod</code>和<code>staticmethod</code>之间的区别</h2>
<p>首先要说明的是:静态方法和类方法都是函数,所以标准函数规则大多适用于它们。我知道你的问题是关于<strong>静态方法</strong>和<strong>类方法</strong>之间的区别(后者在第一个参数中接收类):</p>
<pre class="lang-py prettyprint-override"><code>class Test(object):
def standard_method(*args, **kwargs):
# it is instance method (first argument will be instance)
return args, kwargs
@classmethod
def class_method(*args, **kwargs):
# it is class method (first argument will be class)
return args, kwargs
@staticmethod
def static_method(*args, **kwargs):
# it is static method (receives only arguments passed explicitly)
return args, kwargs
</code></pre>
<p>证据(或者更确切地说是不言而喻的例子)如下:</p>
^{pr2}$
<p>如您所见,传递的参数列表因选择的方法类型而异。您面临的问题是<strong>可变参数数</strong>。在</p>
<h2>解决方案</h2>
<p>有一种解决方法可以用于-use参数解包:</p>
<pre class="lang-py prettyprint-override"><code>def some_decorator(func):
def wrapper(*args, **kwargs):
# do something here
# args is a tuple with positional args, kwargs is dict with keyword args
return func(*args, **kwargs)
return wrapper
</code></pre>
<p>之后,<code>some_decorator</code>返回的函数将接受与修饰函数相同数量的参数。在</p>
<p>因此,这两个例子都会起作用:</p>
<pre class="lang-py prettyprint-override"><code>@some_decorator
def say_hello():
print 'hello'
@some_decorator
def say_something(something):
print something
</code></pre>
<h2>附录</h2>
<p>为了给您一个完整的例子,最好使用这样的结构(注意<code>functools.wraps</code>的用法):</p>
<pre class="lang-py prettyprint-override"><code>from functools import wraps
def some_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
# do something here
# args is a tuple with positional args, kwargs is dict with keyword args
return func(*args, **kwargs)
return wrapper
</code></pre>
<p>其原因在<a href="http://docs.python.org/library/functools.html#functools.wraps" rel="noreferrer">documentation for ^{<cd5>}</a>中列出:它保留了函数名和docstring,有效地使包装看起来像一个包装好的函数(这有时很有用)。在</p>