Мне нужно создать объект или класс контейнера в Python, который хранит запись других объектов, которые я также определяю. Одним из требований этого контейнера является то, что если два объекта считаются идентичными, один (один) удаляется. Моя первая мысль заключалась в том, чтобы использовать set([])
как содержащий объект для выполнения этого требования.
Однако набор не удаляет один из двух идентичных экземпляров объекта. Что я должен определить для его создания?
Вот код 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))
Переводчик
>>> set([Item(1,2), Item(1,2)])
set([Item(1, 2), Item(1, 2)])
Ясно, что __eq__()
, который вызывается x == y
, не является методом, вызываемым множеством. Что вызвано? Какой еще метод я должен определить?
Примечание. Item
s должен оставаться изменчивым и может меняться, поэтому я не могу предоставить метод __hash__()
. Если это единственный способ сделать это, я перепишу для использования неизменяемых Item
s.