Python-Klassengleichheit

Aditya Raj 21 Juni 2023
  1. Gleichheit von Klassenobjekten in Python
  2. Python-Klassengleichheit mit der Methode __eq__()
  3. Python-Klassengleichheit mit der id()-Methode
Python-Klassengleichheit

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.

  1. Die Methode __eq__() nimmt, wenn sie auf einer Instanz der Klasse Length aufgerufen wird, ein anderes Objekt als Eingabeargument.

  2. Innerhalb der Methode __eq__() prüfen wir zuerst, ob das Eingabeobjekt eine Instanz der Klasse Length ist oder nicht. Dazu können wir die Funktion isinstance() verwenden.

  3. Die Funktion isinstance() nimmt ein Python-Objekt als erstes Eingabeargument und den Klassennamen als zweites Eingabeargument. Nach der Ausführung gibt es True zurück, wenn das Objekt eine Instanz der im Eingabeargument angegebenen Klasse ist.

  4. Wir übergeben die Klasse Length als zweites Eingabeargument in unserem Programm. Wenn das im ersten Argument übergebene Objekt keine Instanz der Klasse Length ist, wird False zurückgegeben.

    Andernfalls fahren wir fort.

  5. 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 wir True 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.

Autor: Aditya Raj
Aditya Raj avatar Aditya Raj avatar

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

Verwandter Artikel - Python Class