J'ai besoin de créer un objet ou une classe "conteneur" en Python, qui garde une trace des autres objets que je définis également. L'une des exigences de ce conteneur est que si deux objets sont jugés identiques, l'un (ou l'autre) est supprimé. Ma première idée était d'utiliser une classe set([])
en tant qu'objet contenant, pour remplir cette condition.
Cependant, l'ensemble ne supprime pas l'une des deux instances d'objet identiques. Que dois-je définir pour en créer une ?
Voici le code 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))
Interprète
>>> set([Item(1,2), Item(1,2)])
set([Item(1, 2), Item(1, 2)])
Il est clair que __eq__()
qui est appelé par x == y
n'est pas la méthode appelée par l'ensemble. Qu'est-ce qui est appelé ? Quelle autre méthode dois-je définir ?
Remarque : Le Item
doivent rester mutables, et peuvent changer, donc je ne peux pas fournir un modèle de __hash__()
méthode. Si c'est la seule façon de procéder, alors je réécrirai pour l'utilisation de la méthode immuable Item
s.