Ответ 1
Я боюсь, вам придется предоставить метод __hash__()
. Но вы можете закодировать его так, чтобы он не зависел от изменяемых атрибутов вашего Item
.
Мне нужно создать объект или класс контейнера в 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.
Я боюсь, вам придется предоставить метод __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__())