Как набор 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, не является методом, вызываемым множеством. Как это называется? Какой еще метод я должен определить?

Примечание:Items должен оставаться изменчивым и может меняться, поэтому я не могу предоставить __hash__() метод. Если это единственный способ сделать это, то я перепишу для использования неизменяемого Item s.

2 62

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__())