Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erreicht man elegante Gleichheitsvergleiche in Python-Klassen?

Wie erreicht man elegante Gleichheitsvergleiche in Python-Klassen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-08 08:44:01423Durchsuche

How to Achieve Elegant Equality Comparisons in Python Classes?

Elegante Möglichkeiten zur Unterstützung der Gleichheit („Äquivalenz“) in Python-Klassen

Bei der objektorientierten Programmierung ist es oft entscheidend, Gleichheitsprüfungen zwischen Objekten benutzerdefinierter Klassen zu definieren. Python ermöglicht dies durch die Implementierung spezieller Methoden, eq und __ne__, für Äquivalenz- bzw. Ungleichheitsvergleiche.

Ein etablierter Ansatz besteht darin, die dict-Attribute von zu vergleichen zwei Objekte:

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

Betrachten Sie jedoch Folgendes als einfacher Methode:

class Number:

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

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

Diese prägnante Methode macht komplexe dict-Vergleiche überflüssig und stellt damit eine elegante Alternative dar.

Darüber hinaus verarbeitet sie Unterklassen nahtlos und gewährleistet so kommutative und Konsistente Gleichheitsprüfungen:

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

Um die Lösung zu vervollständigen, ist es wichtig, die zu überschreiben Hash-Methode für konsistentes Hashing und eindeutige Identifizierung:

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)

Dies behebt Hashing-Probleme, die bei der Verwendung von dict für Gleichheitsvergleiche auftreten, und stellt ein zuverlässiges Mengenverhalten und eine eindeutige Identifizierung von sicher verschiedene Objekte.

Das obige ist der detaillierte Inhalt vonWie erreicht man elegante Gleichheitsvergleiche in Python-Klassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn