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
Libérer: 2024-11-08 08:44:01
original
541 Les gens l'ont consulté

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
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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)
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal