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