2016-10-21 58 views
0

我定义一个类,如:Python - 比较2个相同的对象返回False?

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

+1

也需要实现'__eq__'。 –

+0

写出等于执行.. – user2864740

回答

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 
+0

这正是我所需要的,并提供了更详细的答案。谢谢! –

6

你需要重写__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 
+0

也许对'__eq__'和'__hash__'之间的关系发表评论,因为这可能是OP混淆的根源。 –

+0

你可以用'return self .__ dict__ == other .__ dict__'替换丑陋的表情,对吧? –

相关问题