Мне нужно создать объект или класс «контейнер» в 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.