2016-10-21 91 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__'替換醜陋的表情,對吧? –

相關問題