擅长:python、mysql、java
<p>静态方法仍然通过描述符协议工作,这意味着当它是<em>类</em>属性时,通过实例访问它仍然意味着<code>__get__</code>方法将被调用以返回实际被调用的对象。就是</p>
<pre><code>WithDec().stat(2)
</code></pre>
<p>相当于</p>
<pre><code>w = WithDec()
w.stat(2)
</code></pre>
<p>这相当于</p>
<pre><code>WithDec.stat.__get__(w, WithDec)(2)
</code></pre>
<p>但是,当静态方法是一个<em>实例</em>属性时,描述符协议不会被调用,就像<code>WithoutDec</code>的情况一样。那么</p>
<pre><code>WithoutDec().stat(2)
</code></pre>
<p>尝试调用文本<code>staticmethod</code>实例<code>stat</code>,而不是<code>stat.__get__</code>返回的函数</p>
<p>您想要的是使用<code>staticmethod</code>创建类属性,而不是通过decorator语法:</p>
<pre><code>class WithoutDec():
def stat(val):
return val + 1
stat = staticmethod(stat)
</code></pre>
<p>首先将<code>stat</code>绑定到一个常规函数(在尝试将它作为实例方法使用之前,它实际上不是一个实例方法),然后用一个<code>staticmethod</code>实例包装原始函数替换该函数</p>