Как набор Python ([]) проверяет, равны ли два объекта? Какие методы должен определить объект, чтобы настроить это?
мне нужно создать объект или класс "контейнер" в 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.
2 ответа:
боюсь, вам придется предоставить
__hash__()
метод. Но вы можете закодировать его так, чтобы он не зависел от изменяемых атрибутов вашегоItem
.
да, вам нужен
__hash__()
- метод и оператор сравнения, который вы уже предоставили.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__())