Domanda

class x:
    def __init__(self,name):
        self.name=name

    def __str__(self):
        return self.name

    def __cmp__(self,other):
        print("cmp method called with self="+str(self)+",other="+str(other))
        return self.name==other.name
       # return False


instance1=x("hello")
instance2=x("there")

print(instance1==instance2)
print(instance1.name==instance2.name)

L'output è:

cmp method called with self=hello,other=there
True
False

che non è quello che mi aspettavo. Io sto cercando di dire 'due casi sono uguali se i campi del nome sono uguali'

Se ho semplicemente return False dalla funzione __cmp__, questo segnala come True pure !! Se torno -1, poi mi False -. Ma dato che sto cercando di confrontare le stringhe, questo non si sente giusto

Che cosa sto facendo male qui?

È stato utile?

Soluzione

__cmp__(x,y) dovrebbe restituire un numero negativo (ad esempio -1) se x < y, un numero positivo (ad esempio 1) se x > y e 0 se x == y. Non si dovrebbe mai restituire un valore booleano con esso.

Quello che stai sovraccaricare è __eq__(x, y).

Altri suggerimenti

il metodo __cmp__ deve restituire -1, 0 o 1, quando sé altro respectvelly.

Si può fare

return cmp(self.name, other.name)

nel codice per ottenere un risultato corretto

Si sta confondendo __cmp__ con __eq__.

Dalla documentazione di __cmp__:

  

Dovrebbe restituire un intero negativo se self altro.

__eq__ restituisce un booleano che determina se due oggetti sono uguali, __cmp__ restituisce un intero che determina se i due oggetti sono superiori o inferiori a vicenda, e così è chiamato a meno che lo specific __eq__, __ne__, __le__, __ge__, __lt__ e metodi __gt__.

Nel tuo caso si vuole un metodo __cmp__ piuttosto che __eq__ in quanto vi farà risparmiare l'attuazione delle altre 5 metodi per gli altri confronti.

È possibile utilizzare il cmp() funzione e inserire il seguente nel metodo __cmp__:

return cmp(self.name,other.name)

Nota, come evidenziato da Ignacio è presente non è il metodo preferito in Python 3.0 , ma in Python 2.x __cmp__ è la strada da percorrere.

__cmp__() è obsoleta. Definire __lt__(), __eq__() e __gt__() invece.

Anche così, si sta facendo male. Si suppone di restituire un numero intero.

Lookup la documentazione per __cmp__ , youre supposto per restituire un intero:

  

Dovrebbe restituire un intero negativo se   auto altri.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top