Spezielle Methoden und Operator-Überladung

You are here:

Spezielle Methoden sind in Python integrierte Methoden, die mit doppelten Unterstrichen vor und nach dem Methodennamen gekennzeichnet sind (z. B. `__init__`). Diese Methoden werden automatisch aufgerufen, wenn bestimmte Aktionen mit Objekten einer Klasse ausgeführt werden. Operator-Überladung ist das Anpassen des Verhaltens von Operatoren (wie +, -, *, /) für benutzerdefinierte Klassen. In diesem Kapitel werden wir uns ansehen, wie Du spezielle Methoden in Deinen Klassen definieren und Operator-Überladung nutzen kannst.

Spezielle Methoden

Einige der häufig verwendeten speziellen Methoden sind:

– `__init__(self, …)`: Wird aufgerufen, wenn ein Objekt der Klasse erstellt wird.

– `__str__(self)`: Wird aufgerufen, wenn eine Zeichenkettenrepräsentation des Objekts benötigt wird (z. B. bei Verwendung von `print(obj)`).

– `__repr__(self)`: Wird aufgerufen, um eine formelle Zeichenkettenrepräsentation des Objekts zurückzugeben (z. B. im interaktiven Modus oder in Debugging-Sitzungen).

Beispiel:

class Person:

    def __init__(self, name, age):

        self.name = name

        self.age = age

    def __str__(self):

        return f"{self.name}, {self.age} Jahre alt"

    def __repr__(self):

        return f"Person('{self.name}', {self.age})"

Operator-Überladung

Um das Verhalten von Operatoren für benutzerdefinierte Klassen anzupassen, müssen wir spezielle Methoden definieren, die den jeweiligen Operator repräsentieren. Einige Beispiele:

– `__add__(self, other)`: Wird aufgerufen, wenn das `+`-Operator verwendet wird.

– `__sub__(self, other)`: Wird aufgerufen, wenn das `-`-Operator verwendet wird.

– `__mul__(self, other)`: Wird aufgerufen, wenn das `*`-Operator verwendet wird.

– `__truediv__(self, other)`: Wird aufgerufen, wenn das `/`-Operator verwendet wird.

Beispiel:

class Vector:

    def __init__(self, x, y):

        self.x = x

        self.y = y

    def __add__(self, other):

        return Vector(self.x + other.x, self.y + other.y)

    def __sub__(self, other):

        return Vector(self.x - other.x, self.y - other.y)

    def __str__(self):

        return f"({self.x}, {self.y})"

In diesem Beispiel haben wir eine `Vector`-Klasse erstellt, die zwei spezielle Methoden für die `+`- und `-`-Operatoren definiert. Jetzt können wir Vektoren auf einfache Weise addieren und subtrahieren:

v1 = Vector(1, 2)

v2 = Vector(3, 4)

v3 = v1 + v2

v4 = v1 - v2

print(v3)  # Ausgabe: (4, 6)

print(v4)  # Ausgabe: (-2, -2)

Durch das Implementieren von speziellen Methoden und das Anpassen von Operator-Überladung kannst Du Deine benutzerdefinierten Klassen intuitiver und benutzerfreundlicher gestalten. Dabei kannst Du die natürlichen Python-Operatoren verwenden und Deinen Code lesbarer machen.

Vergleichsoperatoren und spezielle Methoden

Auch Vergleichsoperatoren können in Python überladen werden. Hier einige Beispiele für spezielle Methoden, die mit Vergleichsoperatoren korrespondieren:

– `__eq__(self, other)`: Wird aufgerufen, wenn der `==`-Operator verwendet wird.

– `__ne__(self, other)`: Wird aufgerufen, wenn der `!=`-Operator verwendet wird.

– `__lt__(self, other)`: Wird aufgerufen, wenn der `<`-Operator verwendet wird.

– `__le__(self, other)`: Wird aufgerufen, wenn der `<=`-Operator verwendet wird.

– `__gt__(self, other)`: Wird aufgerufen, wenn der `>`-Operator verwendet wird.

– `__ge__(self, other)`: Wird aufgerufen, wenn der `>=`-Operator verwendet wird.

Beispiel:

class Person:

    def __init__(self, name, age):

        self.name = name

        self.age = age

    def __eq__(self, other):

        return self.age == other.age

    def __lt__(self, other):

        return self.age < other.age

Mit diesen speziellen Methoden können wir Personen-Objekte direkt vergleichen:

p1 = Person("Alice", 30)

p2 = Person("Bob", 25)

print(p1 == p2)  # Ausgabe: False

print(p1 < p2)   # Ausgabe: False

print(p1 > p2)   # Ausgabe: True

Indem Du spezielle Methoden und Operator-Überladung in Deinen Python-Klassen verwendest, kannst Du Deinen Code besser strukturieren und natürlicher ausdrücken. Es ermöglicht eine bessere Integration Deiner benutzerdefinierten Klassen in die Python-Programmiersprache und macht sie leichter verständlich und anwendbar für andere Entwickler.