Question

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)

La sortie ici est:

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

Ce qui est pas ce que je pensais. Je suis en train de dire « deux instances sont égales si les champs de nom sont égaux »

Si je return False simplement de la fonction __cmp__, ce que rapporte True aussi bien !! Si je reviens -1, je reçois False -. Mais depuis que je suis en train de comparer des chaînes, cela ne vous semble pas

Qu'est-ce que je fais mal ici?

Était-ce utile?

La solution

__cmp__(x,y) doit renvoyer une valeur négative (par exemple -1) si x < y, un nombre positif (par exemple 1) si x > y et 0 si x == y. Vous ne devriez jamais retourner un booléen avec.

Qu'est-ce que vous surcharge est __eq__(x, y).

Autres conseils

la méthode de __cmp__ doit retourner -1, 0 ou 1, lorsque l'auto respectvelly autre.

Vous pouvez faire

return cmp(self.name, other.name)

dans votre code pour un bon résultat

Vous confondez __cmp__ avec __eq__.

la documentation De __cmp__:

  

doit retourner un entier négatif si l'auto autre.

__eq__ renvoie une valeur booléenne qui détermine si deux objets sont égaux, __cmp__ renvoie un entier qui détermine si les deux objets sont supérieures ou inférieures à l'autre, et est donc appelé à moins d'avoir __eq__ spécifique, __ne__, __le__, __ge__, __lt__ et les méthodes de __gt__.

Dans votre cas, vous voulez une méthode __cmp__ plutôt que __eq__ comme cela vous évitera la mise en œuvre des autres 5 méthodes pour les autres comparaisons.

Vous pouvez utiliser la fonction cmp() et mettre ce qui suit dans votre méthode de __cmp__:

return cmp(self.name,other.name)

Remarque, comme le souligne Ignacio est n'est pas la méthode préférée Python 3.0, mais en Python 2.x __cmp__ est le chemin à parcourir.

__cmp__() est obsolescent. Définir __lt__(), __eq__() et __gt__() à la place.

Même si, vous le faites mal. Vous êtes censé retourner un entier.

Lookup la documentation __cmp__ , vous êtes censé retourner un entier:

  

doit renvoyer un entier négatif si   auto autre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top