Potrzebuję utworzyć obiekt lub klasę „kontenera” w Pythonie, która przechowuje zapis innych obiektów, które również definiuję. Jednym z wymagań tego kontenera jest to, że jeśli dwa obiekty zostaną uznane za identyczne, jeden (albo jeden) zostanie usunięty. Moją pierwszą myślą było użycie a set([])
jako obiektu zawierającego, aby spełnić to wymaganie.
Jednak zestaw nie usuwa jednej z dwóch identycznych instancji obiektu. Co muszę zdefiniować, aby go utworzyć?
Oto kod w Pythonie.
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))
Interpretator
>>> set([Item(1,2), Item(1,2)])
set([Item(1, 2), Item(1, 2)])
Oczywiste jest, że to __eq__()
, co jest wywoływane przez x == y
, nie jest metodą wywoływaną przez zestaw. Jak się nazywa? Jaką inną metodę muszę zdefiniować?
Uwaga: Item
s muszą pozostać zmienne i mogą się zmieniać, więc nie mogę podać __hash__()
metody. Jeśli to jedyny sposób, aby to zrobić, przepiszę tak, aby używał niezmiennych Item
s.