<p>而不是使用<code>Category</code>(例如<code>Category('Analyze', 'True', 'False', 'False', 'FINAL')</code>)的实例作为字典中的键,
听起来您应该使用关联的元组(例如<code>('Analyze', 'True', 'False', 'False', 'FINAL')</code>)。</p>
<p>如果您确实想使用<code>Category</code>的实例作为字典中的键,则需要同时定义<a href="http://docs.python.org/reference/datamodel.html#object.__hash__" rel="nofollow">^{<cd5>}</a>和<code>__eq__</code>方法。
例如:</p>
<pre><code>class Category(object):
def __init__(self,*args):
self.args=args
def __hash__(self):
# Note that this assumes that Category's hash value is immutable
# i.e. self.args does not change.
return hash(self.args)
def __eq__(self,other):
return self.args == other.args
a=Category('Analyze', 'True', 'False', 'False', 'FINAL')
b=Category('Analyze', 'True', 'False', 'False', 'FINAL')
mydict={a:1}
</code></pre>
<p><code>a</code>和<code>b</code>是不同的实例,因此它们具有不同的<code>id</code>s,但它们的哈希值相同:</p>
<pre><code>assert id(a) != id(b)
assert hash(a)==hash(b)
</code></pre>
<p>这表明<code>b</code>是<code>mydict</code>中可接受的键:</p>
<pre><code>print(mydict[a])
# 1
print(mydict[b])
# 1
</code></pre>
<p>另外,不用担心<code>__cmp__</code>。<a href="http://docs.python.org/release/3.0.1/whatsnew/3.0.html#ordering-comparisons" rel="nofollow">In Python 3</a>:</p>
<blockquote>
<p>The cmp() function should be treated as gone, and the <code>__cmp__()</code>
special method is no longer supported. Use <code>__lt__()</code> for sorting,
<code>__eq__()</code> with <code>__hash__()</code>, and other rich comparisons as needed.</p>
</blockquote>