Wenn Sie den Vergleichsoperator auf die definierte Klasse anwenden möchten, implementieren Sie die Rich-Vergleichsmethode. Wenn man eine Klasse betrachtet, die eine Person als Beispiel darstellt, sieht sie folgendermaßen aus:
class Person(object):
def __init__(self, firstname, lastname, email):
self.firstname = firstname
self.lastname = lastname
self.email= email
def __eq__(self, other):
if other is None or not isinstance(other, Person): return False
#Das Folgende ist problematisch
return self.firstname == other.firstname and
self.lastname == other.lastname and
self.email == other.email
def __ne__(self, other):
return not self.__eq__(other)
Um ehrlich zu sein, ist es ärgerlich, jedes Mal, wenn ich eine Klasse definiere, self.xxx == other.xxx und ... zu schreiben. Also werde ich die dict -Methode verwenden, die von der Basisklasse geerbt wurde.
class Person(object):
def __init__(self, firstname, lastname, email):
self.firstname = firstname
self.lastname = lastname
self.email= email
def __eq__(self, other):
# isinstance(other, Person)Entfernen
if other is None or type(self) != type(other): return False
# __dict__Vergleichen Sie Attribute mithilfe von Methoden
return self.__dict__ == other.__dict__
def __ne__(self, other):
return not self.__eq__(other)
Jetzt können Sie die beiden Objekte generisch vergleichen, ohne den Attributnamen zu schreiben. assertEquals wird ebenfalls mit einem Rand bestanden. Es wird angenommen, dass das Attribut eine eq -Methode hat.
Recommended Posts