Python对象作为Dict键使用__hash__进行访问

时间:2017-11-22 16:08:15

标签: python python-3.x dictionary

选择这个超级简单的课程:

class Foo():
    def __init__(self, iden):
        self.iden = iden
    def __hash__(self):
        return hash(self.iden)
    def __repr__(self):
        return str(self.iden)

目标是创建要用作dict键的类的实例。如果省略__repr__,则键是标准对象地址。对于__repr__,可打印的表示可能是:

f = Foo(1)
g = Foo(2)
d = {f:'a', g:'b'}
print(d)
>>> {1:'a', 2:'b'}

但是,当尝试按键访问字典时,似乎并不是很明显如何利用__repr__(或__str__表示)表示作为键。

print(d[1]) 
>>> KeyError

1 个答案:

答案 0 :(得分:1)

第一件事是第一件事:__repr__()是红鲱鱼。它只影响对象的显示方式。它与你想要做的事无关。

如果你想让两个单独的对象引用dict中的同一个插槽,你需要两件事(reference):

  • 对象必须具有相同的哈希值(hash(obj1) == hash(obj2))。
  • 对象必须比较相等(obj1 == obj2)。

你的上述实现是前者,而不是后者。您需要添加__eq__()方法(无论如何,当您定义__hash__()时,documentation实际上都需要这样做。)

class Foo():
    def __init__(self, iden):
        self.iden = iden
    def __hash__(self):
        return hash(self.iden)
    def __eq__(self, other):
        return self.iden == other

>>> d = {Foo(1) : 'a'}
>>> d[1]
'a'