Python-Klassengleichheit
- Gleichheit von Klassenobjekten in Python
-
Python-Klassengleichheit mit der Methode
__eq__()
-
Python-Klassengleichheit mit der
id()
-Methode
In Python können wir verschiedene Datentypen mithilfe von Vergleichsoperatoren vergleichen. Wir können sie jedoch nicht einfach mit den Vergleichsoperatoren vergleichen, wenn wir benutzerdefinierte Klassen erstellen.
In diesem Artikel werden verschiedene Möglichkeiten zum Überprüfen der Gleichheit von Objekten erläutert, die mit benutzerdefinierten Klassen in Python definiert wurden.
Gleichheit von Klassenobjekten in Python
Wenn wir eingebaute Objekte wie Integer oder Strings haben, können wir mit dem Operator ==
, wie unten gezeigt, leicht auf Gleichheit prüfen.
num1 = 12
num2 = 10
result = num1 == num2
print("{} and {} are equal:{}".format(num1, num2, result))
Ausgang:
12 and 10 are equal:False
Hier liefert der Operator ==
den korrekten Wert als Ausgabe, da die Werte 12 und 10 ganze Zahlen sind. Wenn wir jedoch Objekte benutzerdefinierter Klassen haben, funktioniert der Python-Interpreter anders.
Angenommen, wir haben eine Klasse Länge
mit nur einem Attribut, Länge
, wie unten gezeigt.
class Length:
def __init__(self, value):
self.length = value
Wir erstellen zwei Instanzen der Klasse Length
mit demselben Wert im Attribut length
.
class Length:
def __init__(self, value):
self.length = value
len1 = Length(10)
len2 = Length(10)
Wenn Sie die Objekte mit dem Operator ==
vergleichen, ist das Ergebnis False
, obwohl beide Instanzen denselben Wert im Attribut length
haben. Sie können dies im folgenden Code beobachten.
class Length:
def __init__(self, value):
self.length = value
len1 = Length(10)
len2 = Length(10)
result = len1 == len2
print("len1 and len2 are equal:", result)
Ausgang:
len1 and len2 are equal: False
Das obige Verhalten des Python-Interpreters kann anhand der Art und Weise beschrieben werden, wie er zwei Objekte benutzerdefinierter Klassen vergleicht. Wenn wir in Python die Gleichheit zweier Klassenobjekte mit dem Operator ==
überprüfen, ist das Ergebnis nur dann True
, wenn beide Objekte auf denselben Speicherort verweisen.
Mit anderen Worten, es gibt zwei Variablen, aber nur ein einziges Python-Objekt. Dies können Sie im folgenden Beispiel beobachten.
class Length:
def __init__(self, value):
self.length = value
len1 = Length(10)
len2 = len1
result = len1 == len2
print("len1 and len2 are equal:", result)
Ausgang:
len1 and len2 are equal: True
Sie haben vielleicht verstanden, dass der Gleichheitsoperator nur dann True
zurückgibt, wenn beide Variablen auf dieselbe Instanz der benutzerdefinierten Klasse verweisen.
Was sollen wir tun, wenn wir die Gleichheit verschiedener Instanzen einer Klasse in Python überprüfen müssen? Lass es uns herausfinden.
Python-Klassengleichheit mit der Methode __eq__()
Durch Überschreiben der Methode __eq__()
können wir ändern, wie der Operator ==
mit benutzerdefinierten Klassen funktioniert. Um beispielsweise die Länge von zwei Instanzen der Klasse Length
zu prüfen, können wir die Methode __eq__()
überschreiben.
Wir werden die unten beschriebenen Schritte innerhalb der Methode __eq__()
verwenden.
-
Die Methode
__eq__()
nimmt, wenn sie auf einer Instanz der KlasseLength
aufgerufen wird, ein anderes Objekt als Eingabeargument. -
Innerhalb der Methode
__eq__()
prüfen wir zuerst, ob das Eingabeobjekt eine Instanz der KlasseLength
ist oder nicht. Dazu können wir die Funktionisinstance()
verwenden. -
Die Funktion
isinstance()
nimmt ein Python-Objekt als erstes Eingabeargument und den Klassennamen als zweites Eingabeargument. Nach der Ausführung gibt esTrue
zurück, wenn das Objekt eine Instanz der im Eingabeargument angegebenen Klasse ist. -
Wir übergeben die Klasse
Length
als zweites Eingabeargument in unserem Programm. Wenn das im ersten Argument übergebene Objekt keine Instanz der KlasseLength
ist, wirdFalse
zurückgegeben.Andernfalls fahren wir fort.
-
Um die Klassengleichheit der beiden Objekte zu überprüfen, vergleichen wir den Wert des Attributs
Länge
in beiden Objekten. Wenn die Werte gleich sind, geben wirTrue
zurück.Andernfalls geben wir
False
zurück.
Sobald die Methode __eq__()
in der Klasse Length
implementiert ist, können wir zwei Instanzen der Klasse Number
mit dem Operator ==
korrekt vergleichen.
Angenommen, wir haben zwei Instanzen der Klasse Length
, sagen wir len1
und len2
. Wenn wir len1==len2
ausführen, wird die Methode len1.__eq__(len2)
ausgeführt.
In ähnlicher Weise wird, wenn wir len2==len1
ausführen, die Methode len2.__eq__(len1)
ausgeführt.
Nach Ausführung des Codes gibt len1==len2
True
zurück, wenn der Längenwert beider Objekte den gleichen Wert hat. Andernfalls wird False
zurückgegeben.
Dies können Sie im folgenden Beispiel beobachten.
class Length:
def __init__(self, value):
self.length = value
def __eq__(self, other):
isLength = isinstance(other, self.__class__)
if not isLength:
return False
if self.length == other.length:
return True
else:
return False
len1 = Length(10)
len2 = Length(10)
result = len1 == len2
print("len1 and len2 are equal:", result)
Ausgang:
len1 and len2 are equal: True
Python-Klassengleichheit mit der id()
-Methode
Sie können auch prüfen, ob zwei Variablen mit Objekten benutzerdefinierter Klassen auf dasselbe Objekt verweisen oder nicht. Dazu können Sie die Funktion id()
verwenden.
Die Funktion id()
nimmt ein Objekt als Eingabeargument und gibt eine eindeutige Identitätsnummer an einer beliebigen Speicherstelle zurück. Dies können Sie im folgenden Beispiel beobachten.
class Length:
def __init__(self, value):
self.length = value
def __eq__(self, other):
isLength = isinstance(other, self.__class__)
if not isLength:
return False
if self.length == other.length:
return True
else:
return False
len1 = Length(10)
len2 = Length(10)
result1 = id(len1)
result2 = id(len2)
print("ID of len1 is ", result1)
print("ID of len2 is ", result2)
Ausgang:
ID of len1 is 140057455513712
ID of len2 is 140057454483488
Wenn zwei Objekte auf denselben Speicherplatz verweisen, gibt die Funktion id()
für beide Objekte dieselbe Ausgabe aus. Durch den Vergleich der Ausgabe der Funktion id()
können wir überprüfen, ob die Objekte auf denselben Speicherort verweisen oder nicht.
Dies können Sie im folgenden Beispiel beobachten.
class Length:
def __init__(self, value):
self.length = value
def __eq__(self, other):
isLength = isinstance(other, self.__class__)
if not isLength:
return False
if self.length == other.length:
return True
else:
return False
len1 = Length(10)
len2 = Length(10)
result1 = id(len1)
result2 = id(len2)
result = result1 == result2
print("len1 and len2 are equal:", result)
Ausgang:
len1 and len2 are equal: False
Hier können Sie beobachten, dass wir den Wert der Attribute in den Objekten nicht auf Klassengleichheit geprüft haben.
In diesem Fall prüfen wir nur, ob die Objekte auf denselben Speicherort verweisen oder nicht. Daher entspricht dieser Ansatz zur Überprüfung der Python-Klassengleichheit der Verwendung des Operators ==
ohne Implementierung der Methode __eq__()
in der Klassendefinition.
Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.
GitHub