Achtergrond:
De functie super() is geïntroduceerd om het werken met erfelijkheid te vergemakkelijken. Voor de introductie ervan was het nodig om expliciet de naam van de bovenliggende klasse op te geven bij het aanroepen van oudermethoden, wat het mixen en meervoudig erfelijkheid ongemakkelijk maakte en kon leiden tot fouten. super() houdt rekening met de erfelijkheidsvolgorde (MRO).
Probleem:
Bij meervoudig erfelijkheid roept directe toegang tot de bovenliggende klasse vaak alleen zijn methoden aan, terwijl andere voorouders worden genegeerd. Dit breekt de oproepketen. De taak van super() is om de keten van methoden correct op te bouwen in overeenstemming met de hiërarchie.
Oplossing:
super() retourneert een proxy-object dat de oproepen doorgeeft aan de volgende klasse in de MRO-lijn. Dit maakt het mogelijk om de methoden van alle voorouders in de keten eenduidig aan te roepen.
Voorbeeldcode:
class A: def show(self): print("A.show()") class B(A): def show(self): print("B.show() -> ", end="") super().show() class C(A): def show(self): print("C.show() -> ", end="") super().show() class D(B, C): def show(self): print("D.show() -> ", end="") super().show() d = D() d.show() # Output: D.show() -> B.show() -> C.show() -> A.show()
Belangrijkste kenmerken:
Kan super zonder argumenten worden gebruikt in statische methoden?
Nee, in statische methoden zijn er geen self of cls. super() verwacht dat het wordt aangeroepen vanuit een methode van een instantie of klasse, waar informatie over het type object beschikbaar is.
Zal de bovenliggende methode worden aangeroepen als deze wordt overgeslagen in de super() oproepketen?
Nee. Als u in de keten super() niet aanroept, wordt de uitvoering niet "doorgegeven". Daarom is het belangrijk om bij het overschrijven van methoden altijd aan super() te denken, anders wordt een deel van de logica van voorouders overgeslagen.
Kunnen willekeurige argumenten aan super() worden doorgegeven?
Ja, maar de standaardvorm van super() zonder argumenten (in Python 3) helpt fouten te voorkomen en ziet er netter uit. Het doorgeven van argumenten is alleen nodig in zeldzame gevallen (bijvoorbeeld ter compatibiliteit met Python 2), en is meestal niet nodig.
Voordelen:
Negatieve case: In een groot project bevatte de bovenliggende klasse initialisatie, maar een van de afgeleide klassen vergat super().init() aan te roepen. Dit resulteerde in gedeeltelijk geïnitialiseerde objecten met niet-geïnitialiseerde attributen.
Voordelen: het was niet nodig om elke bovenliggende klasse handmatig aan te roepen. Nadelen: moeilijkheid bij het volgen als iemand super() over het hoofd zag.
Positieve case: Een goed geïmplementeerde super() keten zorgde voor de correcte initialisatie van alle basis klassen, waardoor het onderhoud en de ontwikkeling van de architectuur werd vereenvoudigd.
Voordelen: netheid van de code, eenvoud van uitbreiding. Nadelen: gemakkelijk om fouten te maken bij een complex MRO – het vereist begrip van de volgorde van oproepen.