Python set([]) 如何检查两个对象是否相等?对象需要定义哪些方法来自定义它? [英] How does a Python set([]) check if two objects are equal? What methods does an object need to define to customise this?

查看:16
本文介绍了Python set([]) 如何检查两个对象是否相等?对象需要定义哪些方法来自定义它?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

这是 Python 代码.

class Item(object):def __init__(self, foo, bar):self.foo = fooself.bar = bardef __repr__(self):return "Item(%s, %s)" % (self.foo, self.bar)def __eq __(自己,其他):如果是实例(其他,项目):返回 ((self.foo == other.foo) 和 (self.bar == other.bar))别的:返回错误def __ne__(自我,其他):返回(不是 self.__eq__(other))

口译员

<预><代码>>>>设置([项目(1,2),项目(1,2)])设置([项目(1, 2), 项目(1, 2)])

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

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

解决方案

恐怕你必须提供一个 __hash__() 方法.但是你可以用这种方式编码,它不依赖于你的 Item 的可变属性.

I need to create a 'container' object or class in Python, which keeps a record of other objects which I also define. One requirement of this container is that if two objects are deemed to be identical, one (either one) is removed. My first thought was to use a set([]) as the containing object, to complete this requirement.

However, the set does not remove one of the two identical object instances. What must I define to create one?

Here is the Python code.

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

It is clear that __eq__(), which is called by x == y, is not the method called by the set. What is called? What other method must I define?

Note: The Items must remain mutable, and can change, so I cannot provide a __hash__() method. If this is the only way of doing it, then I will rewrite for use of immutable Items.

解决方案

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.

这篇关于Python set([]) 如何检查两个对象是否相等?对象需要定义哪些方法来自定义它?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆