Python设置()如何检查两个对象是否相等? 对象需要定义什么方法来自定义?

我需要在Python中创build一个“容器”对象或类,它保留了我也定义的其他对象的logging。 这个容器的一个要求是,如果两个物体被认为是相同的,则去除一个(任一个)。 我的第一个想法是使用一个set([])作为包含对象,来完成这个要求。

但是,该集不会删除两个相同的对象实例之一。 我必须定义什么来创build一个?

这里是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__()不是该集合调用的方法。 什么叫? 我必须定义什么其他方法?

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

我怕你将不得不提供一个__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__())