Сбой сравнения пользовательских объектов в Python 3.2.2 - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть класс Python, объявленный следующим образом в модуле

class Position:
def __init__(self, x, y):
    self.x = int(x)
    self.y = int(y)
def __str__(self):
    return self.toString()
def toString(self): #deprecated
    return "{x:"+str(self.x)+" y:"+str(self.y)+"}"

Теперь, позже в основной программе, я сделаю сравнение следующим образом:

can_pos = somestreet.endOfStreet(curPos).getPos() #returns a Position object
if(can_pos == atPos): # this returns False
  #blafoo
#if(can_pos.x == atPos.x and can_pos.y == atPos.y): #this returns True (and is expected)

Я делаюне понимаю, в чем может быть причина такого поведения ...

Было бы очень хорошо, если бы кто-нибудь дал мне подсказку на это:)

Заранее спасибо

1 Ответ

3 голосов
/ 09 февраля 2012

Как отмечено в комментариях, вам нужно явно указать __eq__ и __ne__:

class Position:
    def __init__(self, x, y):
        self.x = int(x)
        self.y = int(y)
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y
    def __ne__(self, other):
        return not self == other

, что дает

>>> a = Position(1,2)
>>> b = Position(1,2)
>>> c = Position(2,3)
>>> a == b
True
>>> a == c
False
>>> b == c
False
>>> a != a
False
>>> a != b
False
>>> a != c
True

Обратите внимание, однако, что в Python 2 у вас будет:

>>> a > c
True

и другие, возможно, нежелательные поведения, тогда как в Python 3 (который вы используете) вы получите

TypeError: unorderable types: Position() > Position()
...