2015-02-18 2 views
-2

Я пытаюсь перегрузить оператор == в классе, и это метод инициализации:Перегрузка __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), тогда тест == test2 должен вернуть True. Однако у меня есть test=Point(1,2,3) и test2=Point(1,1,3), и это возвращается True. Кто-нибудь может понять, почему это так?

+1

Это еще не ваш фактический код, 'если тип (справа) не {type_name}' всегда будет истинным, так как вы сравниваете 'Point' с' set' здесь. (Учитывая, что вы где-то определили 'имя_имя ') –

+0

Вы правы. Я обновил свой текущий код, где я пытаюсь использовать self.i, как сказал один из ответов, но безрезультатно. – Tyler

+0

Ваш текущий код ничего не делает для сравнения 'self' с' right', он вернет 'True', когда' right' имеет тип 'Point'. Плюс сама инициализация 'test2 = Point (1,1,3)' не будет выполнена из-за неправильного количества аргументов. –

ответ

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) 
Смежные вопросы