Das Definieren benutzerdefinierter Klassen in Python erfordert häufig die Implementierung eines Gleichheitsvergleichs mithilfe spezieller Methoden , eq und ne__. Ein gängiger Ansatz besteht darin, die __dict-Attribute der Instanzen zu vergleichen.
Der Vergleich von __dict__s bietet eine einfache Möglichkeit, dies zu überprüfen Gleichheit:
def __eq__(self, other): if isinstance(other, self.__class__): return self.__dict__ == other.__dict__ else: return False
Obwohl dieser Ansatz praktisch ist, kann er Nachteile haben:
Es gibt elegantere Alternativen zur Verwendung des dict-Vergleichs:
1. Definieren Sie __slots__:
Deklarieren Sie Slots in Ihrer Klasse, um Instanzattribute auf bestimmte zu beschränken:
class Foo: __slots__ = ['item'] def __init__(self, item): self.item = item
Dadurch wird sichergestellt, dass der Vergleich effizient ist und das Hinzufügen willkürlicher Elemente verhindert wird Attribute zu Instanzen.
2. Verwenden Sie benannte Tupel:
Nutzen Sie die benannten Tupel von Python, um schnell Klassen mit vordefinierten Attributen zu definieren:
from collections import namedtuple Foo = namedtuple('Foo', ['item'])
benannte Tupel unterstützen sofort den Gleichheitsvergleich.
3. Definieren Sie hash und __eq__:
Override hash, um einen Hash basierend auf den wichtigen Klassenattributen zurückzugeben und so eindeutige Hashes für gleiche Objekte sicherzustellen. Implementieren Sie dann eq, um Objekte anhand ihrer Attribute und nicht anhand ihrer Hashes zu vergleichen:
class Foo: def __init__(self, item): self.item = item def __hash__(self): return hash(self.item) def __eq__(self, other): return self.item == other.item
4. Metaklassen verwenden:
Mit Metaklassen können Sie dynamisch Klassen mit benutzerdefiniertem Verhalten erstellen. Sie können eine Metaklasse erstellen, die automatisch die Methoden eq und ne basierend auf den Klassenattributen definiert:
class MyMeta(type): def __new__(cls, name, bases, dct): attributes = tuple(dct.keys()) def __eq__(self, other): return all(getattr(self, attr) == getattr(other, attr) for attr in attributes) dct['__eq__'] = __eq__ return super().__new__(cls, name, bases, dct)
5. Von einer benutzerdefinierten Basisklasse erben:
Erstellen Sie eine Basisklasse mit eq und hash, die bereits für das gewünschte Verhalten definiert sind. Andere Klassen können von dieser Basisklasse erben, um von der Funktionalität des Gleichheitsvergleichs zu profitieren.
Während der Vergleich von __dict__s eine einfache Lösung sein kann, stehen elegantere und effizientere Ansätze zur Implementierung des Gleichheitsvergleichs zur Verfügung in Python-Klassen. Die Wahl der Methode hängt von den spezifischen Anforderungen Ihrer Anwendung ab.
Das obige ist der detaillierte Inhalt vonWie kann man einen Gleichheitsvergleich in Python-Klassen elegant implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!