【问题标题】:Python - comparing 2 identical objects returns False?Python - 比较 2 个相同的对象返回 False?
【发布时间】:2016-10-21 20:37:15
【问题描述】:

我已经这样定义了一个类:

class User:

    Name = ""
    Age = ""
    Gender = ""

    def __init__(self, var1, var2, var3):
        self.Name = var1
        self.Age = var2
        self.Gender = var3

    def __hash__(self):
        return hash(self.Name)

现在当我创建两个相同的对象时:

User1 = User("Ted", "43", "M")
User2 = User("Ted", "43", "M")

并尝试比较它们:

print(User1 == User2)

返回False?

【问题讨论】:

  • 你还需要实现__eq__
  • 编写equals实现..

标签: python equality


【解决方案1】:

你需要重写__eq__方法:

def __eq__(self, other):
    if isinstance(other, User):
        return self.Name == other.Name and \
               self.Age == other.Age and \
               self.Gender == other.Gender
    return NotImplemented

【讨论】:

  • 也许可以评论__eq____hash__之间的关系,因为这可能是OP混淆的根源。
  • 你可以把丑陋的表情换成return self.__dict__ == other.__dict__吧?
【解决方案2】:

Mureinik 提供的答案是正确的,但不完整。

在检查不等式时,仅覆盖 __eq__ 方法会导致意外行为。

例如,User1 != User2 将返回 True 并仅覆盖 __eq__

您想同时定义__eq____ne__

def __eq__(self, other):
    if isinstance(other, User):
        return self.Name == other.Name and \
           self.Age == other.Age and \
           self.Gender == other.Gender
    return NotImplemented

def __ne__(self, other):
    return not self.__eq__(other)

现在,当您执行比较时,您会得到预期的结果:

User1 = User("Ted", "43", "M")
User2 = User("Ted", "43", "M")
print(User1 != User2)
print(User1 == User2)

打印:

False
True

【讨论】:

  • 这正是我所需要的,并提供了更详细的答案。谢谢!
猜你喜欢
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 2019-05-10
  • 2017-09-21
相关资源
最近更新 更多