4 votes

Erreur d'attribut : Configuration de la comparaison riche

J'ai une classe Point avec x y y attributs. J'aimerais obtenir False la comparaison d'un Point avec n'importe quel autre type d'objet. Par exemple, Point(0, 1) == None ne fonctionne pas :

AttributeError: 'NoneType' object has no attribute 'x'

La classe :

class Point():

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

    def __ne__(self, other):
        return not self.__eq__(other)

Comment configurer __eq__ pour obtenir False par rapport à tout autre type d'objet ?

2voto

Blender Points 114729

Je vérifierais si l'autre objet se comporte comme un Point au lieu de rejeter tous les objets non Point objets :

def __eq__(self, other):
  try:
    return self.x == other.x and self.y == other.y
  except AttributeError:
    return False

De cette façon Point(1, 1) == Vector(1, 1) dans le cas où vous utilisez des vecteurs de coordonnées.

1voto

jdi Points 38029
def __eq__(self, other):
    if not isinstance(other, Point):
        return False
    try:
        return self.x == other.x and self.y == other.y
    except AttributeError:
        return False

Il faut d'abord vérifier le type et renvoyer False s'il ne s'agit pas d'une instance de Point. Nous faisons cela au cas où ils comparent un autre type qui a une instance de x o y mais il ne s'agit pas nécessairement du même contexte.

Deuxièmement, il s'agit d'une erreur d'attribut, juste au cas où quelqu'un sous-classerait Point et supprimerait l'attribut ou modifierait Point d'une manière ou d'une autre.

1voto

MRAB Points 9855

Essayez ceci :

def __eq__(self, other):
        return isinstance(other, Point) and self.x == other.x and self.y == other.y

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X