ProgrammatiePython Senior ontwikkelaar

Leg de erfmodellen en het gebruik van super() in Python uit. Wat zijn de bijzonderheden van het gebruik van super() bij meervoudige erfelijkheid en welke fouten kunnen worden gemaakt?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Python ondersteunt meervoudige erfelijkheid, en aanroepingen van oudermethoden worden beheerd door de lineaire volgorde van methode-resolutie (MRO - Method Resolution Order). De functie super() maakt het mogelijk om de methode van de superklasse in de hiërarchie aan te roepen en is bijzonder nuttig bij complexe erfelijkheid.

super() garandeert de correcte aanroep van methoden volgens MRO, en niet alleen van de directe ouder.

Voorbeeldcode:

class A: def do(self): print('A') class B(A): def do(self): print('B') super().do() class C(A): def do(self): print('C') super().do() class D(B, C): def do(self): print('D') super().do() D().do() # Geeft: # D # B # C # A

Fijnere details: Elke methode moet super() aanroepen, anders wordt MRO "verstoord". Ook moeten constructeurs (__init__) super().__init__() aanroepen.

Misleidende vragen.

Vraag: Wat gebeurt er als in de hiërarchie van meervoudige erfelijkheid een van de klassen "vergeet" om super() aan te roepen in zijn methode?

Antwoord: MRO zal worden geschonden, sommige oudermethoden worden gewoon niet aangeroepen. Voorbeeld:

class A: def show(self): print('A') class B(A): def show(self): print('B') class C(A): def show(self): print('C') super().show() class D(B, C): def show(self): print('D'); super().show() D().show() # Geeft: D B # A methoden C en A worden helemaal niet aangeroepen

Voorbeelden van echte fouten door onbekendheid met de fijnere details van het onderwerp.


Verhaal

In een grote erfelijkheid van GUI-componenten vergat men super().__init__() aan te roepen in een van de tussenliggende klassen. Als gevolg daarvan werd een van de widgets niet correct geïnitialiseerd, wat slechts een zeldzame bug "aanwees".

Verhaal

In een REST API-server was er een logger die afhankelijk was van de superklasse, die via MRO aan alle verzoeken gekoppeld moest worden. Een van de klassen riep de logger rechtstreeks aan, en niet via super(), waardoor de aanroepketen werd verstoord, en de berichten niet werden gelogd — het team zocht lang naar de oorzaak.

Verhaal

In een complexe hiërarchie van mixins, bij overrides, vergat een methode om super() aan te roepen. Dit leidde ertoe dat de validatie van een API-eindpunt niet werkte, terwijl deze van een ander correct werkte. De fout werd pas weken later gevonden, na handmatig onderzoek van MRO.