擅长:python、mysql、java
<p>您将遇到Python方法实现中一个更微妙的部分。这取决于普通方法调用的<code>self</code>参数(例如<code>some_instance.method()</code>)是如何绑定的。它使用“描述符”协议,这一协议没有很好的文档记录(至少,它对新的Python程序员来说并不明显)。</p>
<p>描述符是一个具有<code>__get__</code>方法(以及<code>__set__</code>和/或<code>__delete__</code>方法(可选)的对象,但这里我只讨论<code>__get__</code>)。当此类对象存储在类变量中时,只要在实例上查找相应的名称,Python就会调用其<code>__get__</code>方法。注意,这种特殊行为不会发生在存储在实例变量中的描述符对象上,只有那些是类变量的对象。</p>
<p>函数是描述符。这意味着当您将函数保存为类变量时,当您在实例上查找它时,将调用它的<code>__get__</code>方法。该方法将返回一个“绑定方法”对象,该对象将自动将<code>self</code>参数传递给函数。</p>
<p>如果将函数存储在顶级类变量以外的其他位置(例如字典或实例变量中),则不会获得此绑定行为,因为在查找对象时不会调用描述符协议。这通常意味着您要么需要手动传递<code>self</code>,要么应该首先从函数定义中省略<code>self</code>参数(在这种情况下,我建议将函数移出类,以明确它不打算用作方法)。</p>
<p>但如果您愿意,也可以手工构造绑定方法。类型在<code>types</code>模块中公开为<code>types.MethodType</code>。所以你可以这样修改你的代码,它应该可以工作:</p>
<pre><code>def __init__(self,func=None):
if func == None: func=self.default
self.run = types.MethodType(self._getActivation(func), self) # be sure to import types
</code></pre>