Python meerdere overerving
Python meervoudige overerving
In deze zelfstudie leer je over meervoudige overerving in Python en hoe je deze in je programma kunt gebruiken. U leert ook over overerving op meerdere niveaus en de volgorde van de methodeomzetting.
Python Multiple Inheritance
Een klasse kan worden afgeleid uit meer dan één basisklasse in Python, vergelijkbaar met C++. Dit wordt meervoudige overerving genoemd.
Bij meervoudige overerving worden de kenmerken van alle basisklassen overgenomen in de afgeleide klasse. De syntaxis voor meervoudige overerving is vergelijkbaar met enkele overerving.
Voorbeeld
class Base1:
pass
class Base2:
pass
class MultiDerived(Base1, Base2):
pass
Hier, de MultiDerived klasse is afgeleid van Basis1 en Basis2 lessen.
De MultiDerived klasse erft van beide Basis1 en Basis2 lessen.
Python-overerving op meerdere niveaus
We kunnen ook erven van een afgeleide klasse. Dit wordt overerving op meerdere niveaus genoemd. Het kan elke diepte hebben in Python.
Bij overerving op meerdere niveaus worden kenmerken van de basisklasse en de afgeleide klasse overgenomen in de nieuwe afgeleide klasse.
Een voorbeeld met bijbehorende visualisatie wordt hieronder gegeven.
class Base:
pass
class Derived1(Base):
pass
class Derived2(Derived1):
pass
Hier, de Afgeleide1 klasse is afgeleid van de Base klasse, en de Derived2 klasse is afgeleid van de Derived1 klasse.
Methoderesolutievolgorde in Python
Elke klasse in Python is afgeleid van de object
klas. Het is het meest basistype in Python.
Dus technisch gezien zijn alle andere klassen, ingebouwd of door de gebruiker gedefinieerd, afgeleide klassen en zijn alle objecten instanties van de object
klasse.
# Output: True
print(issubclass(list,object))
# Output: True
print(isinstance(5.5,object))
# Output: True
print(isinstance("Hello",object))
In het scenario met meerdere overervingen wordt elk opgegeven kenmerk eerst doorzocht in de huidige klasse. Als het niet wordt gevonden, gaat het zoeken verder in de bovenliggende klassen in de diepte-eerst, links-rechts, zonder twee keer in dezelfde klasse te zoeken.
Dus, in het bovenstaande voorbeeld van MultiDerived
class de zoekvolgorde is [MultiDerived
, Base1
, Base2
, object
]. Deze volgorde wordt ook wel linearisatie van MultiDerived
. genoemd klasse en de set regels die wordt gebruikt om deze volgorde te vinden, wordt Method Resolution Order (MRO) genoemd. .
MRO moet lokale prioriteitsvolgorde voorkomen en ook zorgen voor eentonigheid. Het zorgt ervoor dat een klas altijd voor zijn ouders verschijnt. In het geval van meerdere ouders is de volgorde hetzelfde als bij tupels van basisklassen.
MRO van een klas kan worden gezien als de __mro__
attribuut of de mro()
methode. De eerste retourneert een tuple, terwijl de laatste een lijst retourneert.
>>> MultiDerived.__mro__
(<class '__main__.MultiDerived'>,
<class '__main__.Base1'>,
<class '__main__.Base2'>,
<class 'object'>)
>>> MultiDerived.mro()
[<class '__main__.MultiDerived'>,
<class '__main__.Base1'>,
<class '__main__.Base2'>,
<class 'object'>]
Hier is een iets complexer voorbeeld van meervoudige overerving en de visualisatie ervan samen met de MRO.
# Demonstration of MRO
class X:
pass
class Y:
pass
class Z:
pass
class A(X, Y):
pass
class B(Y, Z):
pass
class M(B, A, Z):
pass
# Output:
# [<class '__main__.M'>, <class '__main__.B'>,
# <class '__main__.A'>, <class '__main__.X'>,
# <class '__main__.Y'>, <class '__main__.Z'>,
# <class 'object'>]
print(M.mro())
Uitvoer
[<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]
Ga naar Discussion on MRO om het daadwerkelijke algoritme te weten over hoe MRO wordt berekend.
Python