Мені потрібно створити об'єкт або клас "контейнер" у Python, який зберігає записи інших об'єктів, які я також визначаю. Однією з вимог цього контейнера є те, що якщо два об’єкти вважаються ідентичними, один (або один) видаляється. Моя перша думка полягала в тому, щоб використовувати a 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.