选择这个超级简单的课程:
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
答案 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'