擅长:python、mysql、java
<p>问题是<code>set</code>比较两个对象的“错误方式”,以便此模式拦截对<code>__eq__()</code>的调用。2006年的配方显然是针对容器编写的,当被问到是否存在<code>x</code>时,会检查容器中已经存在的候选<code>y</code>值:</p>
<pre><code>x == y
</code></pre>
<p>比较,在这种情况下,<code>x</code>上的<code>__eq__()</code>可以在搜索期间执行特殊操作。但是<code>set</code>对象的比较方式与此相反:</p>
^{pr2}$
<p>对于集合中的每个y。因此,当您的数据类型是<code>set</code>时,此模式在这种形式中可能根本不可用。您可以通过如下方式插入<code>Foo.__eq__()</code>来确认这一点:</p>
<pre><code>def __eq__(self, other):
print '__eq__: I am', self.d, self.e, 'and he is', other.d, other.e
return self.__key() == other.__key()
</code></pre>
<p>然后您将看到一条消息,如:</p>
<pre><code>__eq__: I am 4 5 and he is 10 11
</code></pre>
<p>确认相等性比较对集合中已经存在的对象提出了相等性问题,这是,唉,<em>不是用Hettinger的<code>_CaptureEq</code>对象包装的对象。在</p>
<p><strong>更新:</strong></p>
<p>我忘了给你一个建议:你想过用字典吗?因为这里有一个密钥的概念,它是对象内部数据的子集,所以您可能会发现,将密钥的概念从对象本身的概念中分离出来,可能会减少尝试这种复杂的对象拦截的需要。只需编写一个新函数,在给定对象和字典的情况下,计算键并在字典中查找,如果存在键,则返回已在字典中的对象,否则在键处插入新对象。在</p>
<p><strong>更新2:</strong>好吧,看看这个-尼克的答案在一个方向使用<code>NotImplemented</code>,在另一个方向使用<code>NotImplemented</code>来进行比较。给那家伙几个+1!在</p>