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)])

很明显,由 x == y调用的 __eq__()不是集合所调用的方法。叫什么名字?我还必须定义什么其他方法?

注: ItemS 必须保持可变,并且可以改变,所以我不能提供__hash__() < em > 方法。如果这是唯一的方法,那么我将重写使用不可变的 Item

57851 次浏览

I am afraid you will have to provide a __hash__() method. But you can code it the way, that it does not depend on the mutable attributes of your Item.

Yes, you need a __hash__()-method AND the comparing-operator which you already provided.

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