2012-02-08 3 views
0

У меня есть класс питона объявил как следующий в модулеPython 3.2.2 пользовательский объект Comparation не удается

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)+"}" 

Теперь, позже в основной программе, я делаю Comparation так:

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

Вы писали методы сравнения? '__eq__'? '__ne__'? и т. д. Если вы не писали какие-либо методы сравнения, как вы думаете, что сравнение должно работать? –

+0

спасибо, исправил. из cpp;) – Julian

+0

@ S.Lott no Я не писал их, я думал, что python будет сравнивать все атрибуты по умолчанию – Julian

ответ

3

Как было отмечено в комментариях, вы должны определить по крайней мере __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()