Python: Mis clases como claves dict. ¿cómo?

class A(): def __init__(self, data=''): self.data = data def __str__(self): return str(self.data) d = {} elem = A() d[elem] = 'abc' elem2 = A() print d[elem2] # KeyError # actually elem2! was used not elem 

¿Cómo puedo implementar esto sin error?

EDITAR:
FFFUUU, el error fue:
Intenté obtener d[elem2] (no elem ) con otra instancia de A () PERO con el mismo contenido. (me avergüenza)
Aún así … ¿cómo puedo hacer esto? redefinir __hash__ ?

La respuesta es sí, necesita redefinir __hash__() :

 >>> class A(object): ... def __init__(self, data=''): ... self.data = data ... def __eq__(self, another): ... return hasattr(another, 'data') and self.data == another.data ... def __hash__(self): ... return hash(self.data) ... >>> a1, a2, a3 = A('foo'), A('foo'), A('bar') >>> d = {a1: 'foo'} >>> d[a1] 'foo' >>> d[a2] 'foo' >>> d[a3] Traceback (most recent call last): File "", line 1, in KeyError: __main__.A object at 0x927d0> 

Como se explica en otro comentario, la implementación predeterminada de __hash__ es simplemente una identidad, por lo que si desea hacerlo más sofisticado, debe definirlo explícitamente.

Lo que hizo debería funcionar, siempre y cuando no anule los __hash__() y __eq__() . Utilizará la identidad del objeto como igualdad. Si desea una noción diferente de igualdad, puede anular los __hash__() y __eq__() de su clase.