Comment comparer des objets de classe personnalisés pour l'égalité en Python ?

Susan Sarandon
Libérer: 2024-11-03 08:10:29
original
348 Les gens l'ont consulté

How to Compare Custom Class Objects for Equality in Python?

Comparer des objets pour l'égalité par leurs attributs

En Python, comparer deux objets à l'aide de l'opérateur d'égalité (==) ne produit pas toujours le résultat attendu lorsque ces objets sont des instances de classes personnalisées. Pour résoudre ce problème, nous pouvons implémenter la méthode eq pour définir un comportement d'égalité personnalisé pour nos classes personnalisées.

Considérez la classe MyClass avec les attributs foo et bar :

<code class="python">class MyClass:
    def __init__(self, foo, bar):
        self.foo = foo
        self.bar = bar</code>
Copier après la connexion

Deux instances de cette classe, x et y, ont des valeurs d'attribut identiques :

<code class="python">x = MyClass('foo', 'bar')
y = MyClass('foo', 'bar')</code>
Copier après la connexion

Cependant, les comparer à l'aide de l'opérateur d'égalité donne False :

<code class="python">x == y</code>
Copier après la connexion
Copier après la connexion

Pour créer Python considérons ces instances égales, nous implémentons la méthode eq :

<code class="python">class MyClass:
    def __init__(self, foo, bar):
        self.foo = foo
        self.bar = bar

    def __eq__(self, other):
        if not isinstance(other, MyClass):
            return NotImplemented
        return self.foo == other.foo and self.bar == other.bar</code>
Copier après la connexion

Maintenant, comparer x et y renvoie True :

<code class="python">x == y</code>
Copier après la connexion
Copier après la connexion

Notez que l'implémentation de eq rend automatiquement les instances de notre classe impossibles à hacher, empêchant leur stockage dans des ensembles et des dicts. Si notre classe modélise un type immuable, nous devrions également implémenter la méthode hash :

<code class="python">class MyClass:
    def __hash__(self):
        return hash((self.foo, self.bar))</code>
Copier après la connexion

Faire une boucle sur dict pour comparer des valeurs est déconseillée car ce n'est pas vraiment général et peut rencontrer des types incomparables ou impossibles à hacher. Les utilisateurs de Python 2 devront peut-être implémenter cmp au lieu de eq et envisager d'implémenter ne pour le comportement d'inégalité.

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