Python super() – Python 3 super()

Python super() functie stelt ons in staat om expliciet te verwijzen naar de ouderklasse. Het is handig in het geval van overerving waar we superklassefuncties willen aanroepen.

Python super

Om inzicht te krijgen in de Python super functie, moet je weten over Python Overerving. Bij Python Overerving erven de subklassen van de superklasse. Python super() functie stelt ons in staat om de superklasse impliciet te verwijzen. Dus, Python super maakt onze taak eenvoudiger en comfortabeler. Bij het verwijzen naar de superklasse vanuit de subklasse hoeven we de naam van de superklasse niet expliciet te schrijven. In de volgende secties zullen we de Python super functie bespreken.

Voorbeeld van Python super functie

Kijk eerst naar de volgende code die we hebben gebruikt in onze Python Overerving handleiding. In dat voorbeeld was de superklasse Person en de subklasse was Student. Dus de code wordt hieronder getoond.

class Person:
    # initialiseren van de variabelen
    name = ""
    age = 0

    # definitie van constructor
    def __init__(self, person_name, person_age):
        self.name = person_name
        self.age = person_age

        # definitie van klassenmethoden

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

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


# definitie van subklasse begint 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


# einde van subklasse definitie


# Creëer een object van de superklasse
person1 = Person("Richard", 23)
# roep lidmethoden van de objecten aan
person1.show_age()
# Creëer een object van de subklasse
student1 = Student("Max", 22, "102")
print(student1.get_id())
student1.show_name()

In het bovenstaande voorbeeld hebben we de functie van de ouderklasse aangeroepen als:

Person.__init__(self, student_name, student_age) 

Dit kunnen we vervangen door het python super functie-aanroep zoals hieronder.

super().__init__(student_name, student_age)

De uitvoer blijft hetzelfde in beide gevallen, zoals getoond in de onderstaande afbeelding.

Python 3 super

Merk op dat de bovenstaande syntaxis is voor de python 3 super functie. Als je op python 2.x versies bent, dan is het iets anders en moet je de volgende wijzigingen aanbrengen:

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

De eerste verandering is om object als de basis klasse voor Persoon te hebben. Het is vereist om de super functie te gebruiken in Python 2.x versies. Anders krijg je de volgende foutmelding.

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

De tweede verandering in de syntaxis van de super functie zelf. Zoals je kunt zien is de python 3 super functie veel makkelijker te gebruiken en de syntaxis ziet er ook schoon uit.

Python superfunctie met meerlaagse overerving

Zoals we eerder hebben vermeld, stelt de Python super() functie ons in staat om impliciet naar de superklasse te verwijzen. Maar in het geval van meerlaagse overerving naar welke klasse zal het verwijzen? Nou, Python super() zal altijd verwijzen naar de directe superklasse. Ook kan de Python super() functie niet alleen de __init__() functie verwijzen maar ook alle andere functies van de superklasse aanroepen. Dus, in het volgende voorbeeld, zullen we dat zien.

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)

Laten we de output van bovenstaand voorbeeld van python 3 super met meerlaagse overerving bekijken.

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

Dus, uit de output kunnen we duidelijk zien dat de __init__() functie van klasse C eerst is aangeroepen, vervolgens klasse B en daarna klasse A. Hetzelfde gebeurde bij het aanroepen van de sub_method() functie.

Waarom hebben we de Python super functie nodig

Als je eerdere ervaring hebt met de Java-taal, dan zou je moeten weten dat de basisklasse daar ook wordt aangeroepen door een super-object. Dus, dit concept is eigenlijk nuttig voor programmeurs. Python biedt echter ook de mogelijkheid voor de programmeur om de naam van de superklasse te gebruiken om ernaar te verwijzen. En als je programma meerlaagse overerving bevat, dan is deze super() functie nuttig voor jou. Dus, dat is alles over de Python super functie. Hopelijk heb je dit onderwerp begrepen. Gebruik alsjeblieft het opmerkingenveld voor eventuele vragen.

Je kunt de volledige Python-script en meer Python-voorbeelden bekijken op onze GitHub Repository.

Referentie: Officiële Documentatie

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