Potrzebuję utworzyć obiekt lub klasę "kontener" w Pythonie, który przechowuje zapis innych obiektów, które również definiuję. Jednym z wymogów tego pojemnika jest to, że jeśli dwa obiekty są uważane za identyczne, jeden (jeden) jest usuwany. Moją pierwszą myślą było użycie obiektu set([])
, aby spełnić to wymaganie.W jaki sposób zestaw Pythona ([]) sprawdza, czy dwa obiekty są równe? Jakie metody musi zdefiniować obiekt, aby go dostosować?
Zestaw jednak nie usuwa jednej z dwóch identycznych instancji obiektu. Co muszę zdefiniować, aby je utworzyć?
Oto kod Pythona.
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))
Interpreter
>>> set([Item(1,2), Item(1,2)])
set([Item(1, 2), Item(1, 2)])
Jest oczywiste, że __eq__()
, która jest wywoływana przez x == y
, nie jest metoda zwana przez zestaw. Jak się nazywa? Jaką inną metodę muszę zdefiniować?
Uwaga:Item
s musi pozostać zmienny i może się zmienić, więc nie mogę dostarczenie sposobu__hash__()
. Jeśli jest to jedyny sposób, aby to zrobić, to przepisuję na użytek niezmiennego s. Item
.
Miał ten sam problem. Zakładam, że manipulujesz małymi ilościami danych w swoim kodzie. Prawdopodobnie nie jest to dobry kandydat do korzystania z bazy danych. Pamiętam, że mogłem stworzyć zestaw i zdefiniować funkcję komparatora w C++ i ja też wierzę w Javę, jednak nie wygląda na to, że można to zrobić z obiektami słownikowymi w Pythonie. Wygląda na to, że ktoś mógł napisać bibliotekę "zestawu" w Pythonie, która może to zrobić, ale ja nie jestem tego świadomy. –