擅长:python、mysql、java
<p>一个问题是<code>__eq__</code>对于一个有<code>compressedMd5</code>而另一个没有<code>compressedMd5</code>的对象对是不可交换的(即其<code>compressedMd5</code>被设置为<code>None</code>)。这意味着可以构造两个对象<code>a</code>和<code>b</code>,使得<code>a == b</code>同时<code>b != a</code>。你知道吗</p>
<p>一个相关的问题是<code>__eq__</code>和<code>__hash__</code>在相似的情况下不一致(<code>__eq__</code>会拒绝看<code>other.compressedMd5</code>如果<code>self.compressedMd5</code>是<code>None</code>)</p>
<p>易变性也可能是一个问题,如下例所示:</p>
<pre><code>class Chunk(object):
def __init__(self, md5):
self.md5 = md5
def __hash__(self):
return hash(self.md5)
s = set()
chunk = Chunk('42')
s.add(chunk)
chunk.md5 = '123'
s.add(chunk)
print(s)
</code></pre>
<p>在我的电脑上,这会产生<code>set([<__main__.Chunk object at 0x106d03390>, <__main__.Chunk object at 0x106d03390>])</code>,即同一对象在集合中出现两次。你知道吗</p>
<p>如果更改<code>md5</code>或设置/取消设置/更改<code>compressedMd5</code>,代码中可能会发生类似的情况。你知道吗</p>