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!