Python super() – Python 3 super()

Die Python super() Funktion ermöglicht es uns, explizit auf die Elternklasse zu verweisen. Dies ist nützlich, wenn wir Funktionen der Superklasse aufrufen wollen.

Python super

Um die Python super Funktion zu verstehen, musst du über Python Vererbung Bescheid wissen. Bei der Python Vererbung erben die Unterklassen von der Superklasse. Die Python super() Funktion ermöglicht es uns, implizit auf die Superklasse zu verweisen. Dadurch wird unsere Aufgabe in Python einfacher und bequemer. Beim Verweisen auf die Superklasse von der Unterklasse aus müssen wir den Namen der Superklasse nicht explizit angeben. In den folgenden Abschnitten werden wir die Python super Funktion diskutieren.

Beispiel für die Python super Funktion

Schau dir zunächst den folgenden Code an, den wir in unserem Python Vererbung Tutorial verwendet haben. In diesem Beispielcode war die Superklasse Person und die Unterklasse Student. Der Code sieht wie folgt aus.

class Person:
    # Initialisieren der Variablen
    name = ""
    age = 0

    # Definieren des Konstruktors
    def __init__(self, person_name, person_age):
        self.name = person_name
        self.age = person_age

        # Definieren der Klassenmethoden

    def show_name(self):
        print(self.name)

    def show_age(self):
        print(self.age)


# Definition der Unterklasse beginnt hier
class Student(Person):
    studentId = ""

    def __init__(self, student_name, student_age, student_id):
        Person.__init__(self, student_name, student_age)
        self.studentId = student_id

    def get_id(self):
        return self.studentId  # returns the value of student id


# Ende der Unterklasse Definition


# Erstellen eines Objekts der Superklasse
person1 = Person("Richard", 23)
# Aufruf von Elementmethoden der Objekte
person1.show_age()
# Erstellen eines Objekts der Unterklasse
student1 = Student("Max", 22, "102")
print(student1.get_id())
student1.show_name()

In dem obigen Beispiel haben wir die Funktion der Elternklasse aufgerufen wie folgt:

Person.__init__(self, student_name, student_age) 

Wir können dies durch einen Aufruf der Python-Superfunktion ersetzen, wie unten gezeigt.

super().__init__(student_name, student_age)

Die Ausgabe bleibt in beiden Fällen gleich, wie im untenstehenden Bild gezeigt.

Python 3 super

Beachten Sie, dass die obige Syntax für die Python 3 Superfunktion ist. Wenn Sie Python 2.x-Versionen verwenden, ist sie etwas anders, und Sie müssen die folgenden Änderungen vornehmen:

class Person(object):
...
        super(Student, self).__init__(student_name, student_age)

Die erste Änderung besteht darin, object als Basisklasse für Person zu haben. Es ist erforderlich, die Superfunktion in Python 2.x-Versionen zu verwenden. Andernfalls erhalten Sie den folgenden Fehler.

Traceback (most recent call last):
  File "super_example.py", line 40, in <module>
    student1 = Student("Max", 22, "102")
  File "super_example.py", line 25, in __init__
    super(Student, self).__init__(student_name, student_age)
TypeError: must be type, not classobj

Die zweite Änderung betrifft die Syntax der Superfunktion selbst. Wie Sie sehen können, ist die Python 3 Superfunktion viel einfacher zu verwenden und die Syntax sieht auch sauberer aus.

Python Superfunktion mit mehrstufiger Vererbung

Wie wir bereits erwähnt haben, ermöglicht uns die Python super() Funktion, implizit auf die Superklasse zu verweisen. Aber im Fall von mehrstufigen Vererbungen auf welche Klasse wird sie sich beziehen? Nun, Python super() wird immer auf die unmittelbare Superklasse verweisen. Außerdem kann die Python super() Funktion nicht nur die __init__() Funktion aufrufen, sondern auch alle anderen Funktionen der Superklasse aufrufen. Also werden wir das im folgenden Beispiel sehen.

class A:
    def __init__(self):
        print('Initializing: class A')

    def sub_method(self, b):
        print('Printing from class A:', b)


class B(A):
    def __init__(self):
        print('Initializing: class B')
        super().__init__()

    def sub_method(self, b):
        print('Printing from class B:', b)
        super().sub_method(b + 1)


class C(B):
    def __init__(self):
        print('Initializing: class C')
        super().__init__()

    def sub_method(self, b):
        print('Printing from class C:', b)
        super().sub_method(b + 1)


if __name__ == '__main__':
    c = C()
    c.sub_method(1)

Lassen Sie uns die Ausgabe des obigen Python 3 Superbeispiels mit mehrstufiger Vererbung sehen.

Initializing: class C
Initializing: class B
Initializing: class A
Printing from class C: 1
Printing from class B: 2
Printing from class A: 3

Aus der Ausgabe können wir klar erkennen, dass zuerst die __init__() Funktion der Klasse C aufgerufen wurde, dann Klasse B und danach Klasse A. Ähnliches passierte beim Aufrufen der sub_method() Funktion.

Warum benötigen wir die Python Superfunktion

Wenn Sie bereits Erfahrung mit der Java-Sprache haben, sollten Sie wissen, dass die Basisklasse dort auch von einem super-Objekt aufgerufen wird. Dieses Konzept ist also tatsächlich nützlich für die Entwickler. Python bietet jedoch auch die Möglichkeit für den Programmierer, den Namen der Superklasse zu verwenden, um auf sie zu verweisen. Und wenn Ihr Programm mehrstufige Vererbung enthält, ist diese super() Funktion hilfreich. Das ist also alles zur Python-Super-Funktion. Hoffentlich haben Sie dieses Thema verstanden. Verwenden Sie das Kommentarfeld für eventuelle Fragen.

Sie können das komplette Python-Skript und weitere Python-Beispiele in unserem GitHub-Repository überprüfen.

Referenz: Offizielle Dokumentation

Source:
https://www.digitalocean.com/community/tutorials/python-super