__eq__ Methode in Python

Haider Ali 8 April 2022
__eq__ Methode in Python

Diese Anleitung zeigt, wie wir mit der Methode __eq__() in Python umgehen. Wir werden verschiedene Objekte kompilieren und die Funktionsweise dieser speziellen Methode kennenlernen. Tauchen wir gleich ein.

__eq__() in Python

Erstens ist __eq__() eine dumme/magische Methode, wie Sie sehen können, dass ihr doppelte Unterstriche vorangehen und folgen. Immer wenn Sie den Operator == verwenden, wird diese Methode bereits aufgerufen, um zwei Klasseninstanzen zu vergleichen. Python verwendet den is-Operator zum Vergleich, wenn Sie keine spezifische Implementierung für die Methode __eq__() bereitstellen. Aber wie spezifiziert man diese Methode? Die Antwort darauf liegt im Überschreiben dieser Funktion. Sehen Sie sich den folgenden Code an.

# __eq__ this is called dunder/magic method in python

# class of student has constructor with two arguments
class Student:
    def __init__(self, name, roll):
        self.name = name
        self.roll = roll


# object one of class student
s1 = Student("David", 293)
# object two of class student
s2 = Student("David", 293)


# Applying equality function two objects
print(s1 == s2)

Ausgabe:

False

Wie Sie sehen können, haben wir eine Klasse namens Student erstellt und zwei ihrer Argumente als name und roll angegeben. Später haben Sie zwei Instanzen mit den gleichen Student-Klassendaten erstellt. Der Vergleich dieser beiden Instanzen, wie wir es im obigen Code getan haben, ergibt eine false Ausgabe.

Obwohl diese Instanzen die gleichen Daten haben, sind sie nach dem Vergleich nicht gleich. Dies liegt daran, dass der Operator == die Adressen der Fälle vergleicht, was unterschiedlich ist. Sie können das sehen, indem Sie den folgenden Code und den obigen Code ausführen.

# Both objects have different ids thats why the s1==s2 is false
print(id(s1))
print(id(s2))

Ausgabe:

1991016021344   //(it will vary)
1991021345808   //(it will vary)

Aber wenn wir eine Instanz erstellen und diese Instanz später in einem anderen Beispiel wie dem folgenden speichern würden, wären ihre Adressen dieselben. Schau mal.

# object one of class student
s1 = Student("Ahsan", 293)
s3 = s1

# In this case we have same id for s1 and s3
print(s1 == s3)
print(id(s1))
print(id(s3))

Ausgabe:

True
1913894976432  //(it will vary)
1913894976432  //(it will vary)

Es würde Ihnen als Ausgabe true geben. Wie können wir also die beiden Instanzen anhand der Daten vergleichen? Wir müssen die Dunder-Methode implementieren und wie folgt überschreiben.

# class of student has constructor with two arguments and a modified dunder method of __eq__
class Student:
    def __init__(self, name, roll):
        self.name = name
        self.roll = roll

    # implementing the dunder method
    def __eq__(self, obj):
        # checking both objects of same class
        if isinstance(obj, Student):
            if self.roll == obj.roll:
                return True
            else:
                return False


# object of class student
s4 = Student("David", 293)
# other object of class student
s5 = Student("David", 293)

# Applying equality function two objects
print(s4 == s5)


# Both objects have different ids, but the s4==s5 is true because we override the __eq__ function it will give true when the roll number is some
print(id(s4))
print(id(s5))


# object of class student
s6 = Student("David", 293)
# other object of class student
s7 = Student("David", 178)


# Applying equality function two objects will give us False because the roll is different
print(s6 == s7)

Ausgabe:

True
1935568125136   //(it will vary)
1935568124656   //(it will vary)
False

Jetzt überschreiben wir die Methode __eq__(), indem wir eine if-Bedingung einfügen, die prüft, ob der roll gleich ist oder nicht. So überschreiben Sie eine __eq__()-Methode in Python.

Autor: Haider Ali
Haider Ali avatar Haider Ali avatar

Haider specializes in technical writing. He has a solid background in computer science that allows him to create engaging, original, and compelling technical tutorials. In his free time, he enjoys adding new skills to his repertoire and watching Netflix.

LinkedIn