Meervoudige overerving — de mogelijkheid voor een klasse om van meerdere ouderklassen over te erven — is in Python ontstaan uit andere OOP-talen (zoals C++), waar het helpt bij het creëren van herbruikbare mixins. De ontwikkeling van de methode-opzoekmechanisme (MRO) heeft veel tijd gekost om voorspelbaarheid bij methodenconflicten te waarborgen.
Een klasse kan methoden met dezelfde naam uit verschillende basis klassen ontvangen. Hoe bepaal je welke methode te gebruiken bij het aanroepen? Zonder een duidelijke aanpak leidt dit tot moeilijk te traceren fouten.
Python implementeert een MRO-algoritme (C3-linearization), dat een strikte volgorde van methodenopzoeking definieert bij het oplossen van conflicten in de hiërarchie. Het wordt transparant als je de functie super() en de methode __mro__ van klassen gebruikt om de erfketen te analyseren.
Voorbeeldcode:
class A: def foo(self): print("A") class B(A): def foo(self): print("B") super().foo() class C(A): def foo(self): print("C") super().foo() class D(B, C): def foo(self): print("D") super().foo() D().foo() print(D.__mro__)
Belangrijke kenmerken:
__mro__ worden bekeken;Wat gebeurt er als de namen van de oudermethoden overeenkomen?
Antwoord: De methode wordt aangeroepen in de volgorde gedefinieerd door de MRO. De eerste gevonden methode met de gevraagde naam in de keten — dat is degene die wordt opgeroepen.
Kan super() zonder expliciete overdracht van self worden gebruikt?
Antwoord: In Python 3 — ja, de aanroep super().method() in de body van de klasse-methode is gelijk aan de expliciete super(Klas, self).method(), maar alleen binnen de klasse.
Kan de MRO-volgorde van een bestaande klasse worden gewijzigd?
Antwoord: De MRO-volgorde is statisch na de declaratie van de klasse, maar het kan worden onderzocht (of een nieuwe klasse met een andere erfvolgorde worden gemaakt).
In een project werden twee mixins gecreëerd met een vergelijkbare methode, en de afgeleide klasse gebruikt beide mixins, maar roept de methoden rechtstreeks aan via de klassenaam, waardoor de volgorde van gebeurtenissen wordt verstoord.
Voordelen:
Nadelen:
Gebruik super() in elke methode van de mixins, wat ervoor zorgt dat aanroepen in de keten plaatsvinden en niet de gewenste gedragingen worden overgeslagen.
Voordelen:
Nadelen: