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.
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.
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
Verhaal
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
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.