2015-02-18 21 views
-2

我試圖重載一個類中的==操作符,這是init方法:重載__eq__一類

class Point: 
    def __init__(self, a, b, c, d): 
     self.a = a 
     self.b = b 
     self.c = c 
     self.d = d 
     self._fields = ['a','b','c','d'] 

我試圖重載==操作符,並在這裏是我的代碼:

def __eq__(self,right): 
     if type(right) == type(self): 
      for i in self._fields: 
       print(self._fields.index(i)) 
     else: 
      return False 
     return True 

對於==是真實的,在初始化所有的值應該是相同的。所以如果我有test=Point(1,2,3),然後我有test2 = Point(1,2,3),那麼test == test2應該返回True。但是,我有test=Point(1,2,3)test2=Point(1,1,3),這是返回True。任何人都可以弄清楚爲什麼這是?

+1

這仍然不是你的實際代碼,'如果類型(右)是不是{TYPE_NAME}:'在你將'Point'與'set'比較的情況下總是如此(考慮到你已經在某處定義了'type_name') – 2015-02-18 00:37:18

+0

你是對的。我已經更新了當前的代碼,我嘗試使用self.i作爲答案中的一個,但無濟於事。 – Tyler 2015-02-18 00:40:27

+0

你當前的代碼沒有做任何事情來比較'self'和'right',當'right'是'Point'類型時,它最終返回'True'。加上'test2 = Point(1,1,3)'初始化本身將失敗,因爲參數的數量不正確。 – 2015-02-18 00:42:29

回答

2

您正在測試是否self['a'] == right['a']什麼時候你想要的是self.a == right.a。你應該使用getattr函數來做你想做的事情。

1

當前,迭代遍歷字段時所有代碼都會打印出索引。它只會爲不同類型的對象返回False。相反,你應該使用getattr獲得對應的名字在_fields的實際屬性值:

def __eq__(self, other): 
    return (self._fields == other._fields and 
      all(getattr(self, attr) == getattr(other, attr) for attr in self._fields) 

請注意,我已經改變了測試具有相同類型的兩個對象進行一個檢查,他們有相同的字段(這是一種鴨子打字)。如果你想堅持一個類型檢查,我會讓_fields成爲一個類屬性,所以你會知道每個實例都有相同的值。

另外,還可以用_fields屬性做完全消失,只是硬編碼的屬性名稱:

def __eq__(self, other): 
    return (type(self) == type(other) and 
      self.a == other.a and self.b == other.b and 
      self.c == other.c and self.d == other.d)