Подтвердить что ты не робот

Как набор 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.

4b9b3361

Ответ 1

Я боюсь, вам придется предоставить метод __hash__(). Но вы можете закодировать его так, чтобы он не зависел от изменяемых атрибутов вашего Item.

Ответ 2

Да, вам нужен __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__())