首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python set([])如何检查两个对象是否相等?对象需要定义什么方法来定制它?

Python set([])如何检查两个对象是否相等?对象需要定义什么方法来定制它?
EN

Stack Overflow用户
提问于 2010-10-15 20:42:37
回答 2查看 51.4K关注 0票数 92

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

但是,该集合不会删除两个相同的对象实例中的一个。我必须定义什么才能创建一个?

以下是Python代码。

代码语言:javascript
复制
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))

解释器

代码语言:javascript
复制
>>> set([Item(1,2), Item(1,2)])
set([Item(1, 2), Item(1, 2)])

很明显,x == y调用的__eq__()不是set调用的方法。这叫什么?我还必须定义什么其他方法?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-15 20:46:02

恐怕您必须提供一个__hash__()方法。但是您可以这样编写代码,即它不依赖于Item的可变属性。

票数 37
EN

Stack Overflow用户

发布于 2013-06-26 00:31:07

是的,您需要一个__hash__()-method和您已经提供的比较操作符。

代码语言:javascript
复制
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__())
票数 76
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3942303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档