Jzl*_*325 1 python dictionary python-3.x
参加这个超级简单的课程:
class Foo():
def __init__(self, iden):
self.iden = iden
def __hash__(self):
return hash(self.iden)
def __repr__(self):
return str(self.iden)
Run Code Online (Sandbox Code Playgroud)
目标是创建类的实例以用作字典键。如果__repr__省略,则键是标准对象地址。可__repr__打印的表示可能是:
f = Foo(1)
g = Foo(2)
d = {f:'a', g:'b'}
print(d)
>>> {1:'a', 2:'b'}
Run Code Online (Sandbox Code Playgroud)
__repr__然而,当尝试通过键访问字典时,如何利用(或__str__就此而言)表示形式作为键似乎并不是立即显而易见的。
print(d[1])
>>> KeyError
Run Code Online (Sandbox Code Playgroud)
首先,__repr__()这是一个转移注意力的事情。它仅影响对象的显示方式。它与你想要做的事情无关。
如果你想让两个单独的对象引用字典中的同一个槽,你需要两件事(引用):
hash(obj1) == hash(obj2))。obj1 == obj2)。您的上述实现执行前者,但不执行后者。您需要添加一个方法(无论如何,当您定义时,文档__eq__()实际上需要该方法)。__hash__()
class Foo():
def __init__(self, iden):
self.iden = iden
def __hash__(self):
return hash(self.iden)
def __eq__(self, other):
return self.iden == other
Run Code Online (Sandbox Code Playgroud)
>>> d = {Foo(1) : 'a'}
>>> d[1]
'a'
Run Code Online (Sandbox Code Playgroud)