<p><code>__contains__</code>不是全局变量;它是一个类属性,因此必须通过<code>BinTree</code>或其实例之一进行访问。至少,你需要写作</p>
<pre><code>def __contains__(self, key):
if self.root == None:
return False
elif key == self.root.key:
return True
elif key < self.root.key:
return <b>BinTree.__contains__(self.root.left, key)</b>
elif key > self.root.key:
return <b>BinTree.__contains__(self.root.right, key)</b></code></pre>
<p>(请注意,第一个参数中不需要<code>key</code>属性;具有<code>left</code>和<code>right</code>属性的是<code>self.root</code>本身,而不是它的键</p>
<p>但是,这只是调用实例属性的一种非标准方法,它会阻止继承正确工作。如果您更改类的名称而不更新方法的定义以使用新名称,它也会失败。下一个最好的方法是正常调用该方法</p>
<pre><code>def __contains__(self, key):
if self.root == None:
return False
elif key == self.root.key:
return True
elif key < self.root.key:
return <b>self.root.left.__contains__(key)</b>
elif key > self.root.key:
return <b>self.root.right.__contains__(key)</b></code></pre>
<p>但最重要的是不要直接调用<code>__contains__</code>,而是使用来使用<code>in</code>,这将为您调用<code>__contains__</code></p>
<pre><code>def __contains__(self, key):
if self.root == None:
return False
elif key == self.root.key:
return True
elif key < self.root.key:
return <b>key in self.root.left</b>
else: # key > self.root.key is the only option left
return <b>key in self.root.right</b></code></pre>
<p>警告:以上所有假设<code>self.root.left</code>和<code>self.root.right</code>存在且不是<code>None</code>,这一假设可能不准确,但如果没有显示<code>BinTree</code>如何构造的代码,则无法确认</p>