¿Cómo verifica un conjunto de Python () si dos objetos son iguales? ¿Qué métodos necesita definir un objeto para personalizar esto?

Necesito crear un objeto o clase ‘contenedor’ en Python, que mantiene un registro de otros objetos que también defino. Un requisito de este contenedor es que si dos objetos se consideran idénticos, uno (cualquiera de los dos) se elimina. Mi primer pensamiento fue usar un set([]) como el objeto contenedor para completar este requisito.

Sin embargo, el conjunto no elimina una de las dos instancias de objeto idénticas. ¿Qué debo definir para crear uno?

Aquí está el código de Python.

 class Item(object): def __init__(self, foo, bar): self.foo = foo self.bar = bar def __repr__(self): return "Item(%s, %s)" % (self.foo, self.bar) def __eq__(self, other): if isinstance(other, Item): return ((self.foo == other.foo) and (self.bar == other.bar)) else: return False def __ne__(self, other): return (not self.__eq__(other)) 

Interprete

 >>> set([Item(1,2), Item(1,2)]) set([Item(1, 2), Item(1, 2)]) 

Está claro que __eq__() , que es llamado por x == y , no es el método llamado por el conjunto. ¿Que es llamado? ¿Qué otro método debo definir?

Nota: Los Item s deben ser mutables y pueden cambiar, por lo que no puedo proporcionar un __hash__() . Si esta es la única forma de hacerlo, entonces reescribiré para el uso de Item inmutables.

Me temo que tendrá que proporcionar un __hash__() . Pero puede codificarlo de la manera que no dependa de los atributos mutables de su Item .

Sí, necesita un __hash__() -método Y el operador de comparación que ya proporcionó.

 class Item(object): def __init__(self, foo, bar): self.foo = foo self.bar = bar def __repr__(self): return "Item(%s, %s)" % (self.foo, self.bar) def __eq__(self, other): if isinstance(other, Item): return ((self.foo == other.foo) and (self.bar == other.bar)) else: return False def __ne__(self, other): return (not self.__eq__(other)) def __hash__(self): return hash(self.__repr__())