Maison >développement back-end >Tutoriel Python >Comment réaliser des comparaisons d'égalité élégantes dans les classes Python ?

Comment réaliser des comparaisons d'égalité élégantes dans les classes Python ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-08 08:44:01502parcourir

How to Achieve Elegant Equality Comparisons in Python Classes?

Des façons élégantes de prendre en charge l'égalité (« équivalence ») dans les classes Python

Dans la programmation orientée objet, il est souvent crucial de définir des contrôles d'égalité entre les objets des classes personnalisées. Python permet cela grâce à la mise en œuvre de méthodes spéciales, eq et __ne__, pour les comparaisons d'équivalence et d'inégalité, respectivement.

Une approche établie consiste à comparer les attributs dict de deux objets :

class Foo:
    def __init__(self, item):
        self.item = item

    def __eq__(self, other):
        if isinstance(other, self.__class__):
            return self.__dict__ == other.__dict__
        else:
            return False

Cependant, considérons la méthode plus simple suivante :

class Number:

    def __init__(self, number):
        self.number = number

    def __eq__(self, other):
        return isinstance(other, Number) and self.number == other.number

Cette méthode concise élimine le besoin de comparaisons complexes dict, ce qui en fait une méthode élégante alternative.

De plus, il gère les sous-classements de manière transparente, garantissant des contrôles d'égalité commutatifs et cohérents :

class SubNumber(Number):
    pass

n1 = Number(1)
n2 = Number(1)
n3 = SubNumber(1)
n4 = SubNumber(4)

print(n1 == n2) # True
print(n2 == n1) # True
print(n1 == n3) # True
print(n1 != n4) # True
print(len(set([n1, n2, n3])))  # 1

Pour compléter la solution, il est essentiel de remplacer la méthode hash pour hachage cohérent et identification unique :

class Number:

    def __init__(self, number):
        self.number = number

    def __eq__(self, other):
        return isinstance(other, Number) and self.number == other.number

    def __hash__(self):
        return hash(self.number)

Cela résout les problèmes de hachage rencontrés lors de l'utilisation de dict pour les comparaisons d'égalité, garantissant un comportement d'ensemble fiable et une identification unique d'objets distincts.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn