Python multiple inheritance, multilevel inheritance en Method Resolution Order (MRO)
Python Multiple Inheritance
Python staat toe dat een klasse erft van meer dan één basisklasse, net als C++. Deze feature heet multiple inheritance en laat een afgeleide klasse gedrag combineren van verschillende parent-klassen.
De syntax spiegelt single inheritance: je lijst alle parent-klassen tussen haakjes, gescheiden door komma's.
Voorbeeld
class Basis1: pass
class Basis2: pass
class MultiAfgeleide(Basis1, Basis2): pass
In dit voorbeeld erft MultiAfgeleide attributen en methoden van zowel Basis1 als Basis2.

Diagram: MultiAfgeleide ontvangt features van Basis1 en Basis2.
Python Multilevel Inheritance
Naast twee niveaus kun je erfelijkheid koppelen: een klasse erft van een afgeleide klasse, wat een multilevel inheritance-hiërarchie creëert. Python ondersteunt elke diepte.
Elke nieuwe afgeleide klasse erft van zijn directe ouder, terwijl ook de voorouders attributen meegenomen worden.
Voorbeeld:
class Basis: pass
class Afgeleide1(Basis): pass
class Afgeleide2(Afgeleide1): pass
Hier breidt Afgeleide1 Basis uit, en Afgeleide2 breidt Afgeleide1 verder uit, vormend een drieniveauketen.

Method Resolution Order (MRO) in Python
Elke Python-klasse erft uiteindelijk van object, de universele basistype. Daarom zijn alle objecten instanties van object, of ze nu built-in of user-defined zijn:
# Uitvoer: True
print(issubclass(list,object))
# Uitvoer: True
print(isinstance(5.5,object))
# Uitvoer: True
print(isinstance("Hallo",object))
Bij multiple inheritance lost Python attributen op met een depth-first, left-to-right traversal, zonder een klasse tweemaal te bezoeken. Deze traversal-volgorde heet de Method Resolution Order (MRO) en garandeert dat een klasse voor zijn ouders verschijnt.
De MRO voor MultiAfgeleide is: [MultiAfgeleide, Basis1, Basis2, object]. Je kunt het bekijken via het __mro__-attribuut of de mro()-methode:
MultiAfgeleide.__mro__
# (<class '__main__.MultiAfgeleide'>, <class '__main__.Basis1'>, <class '__main__.Basis2'>, <class 'object'>)
MultiAfgeleide.mro()
# [<class '__main__.MultiAfgeleide'>, <class '__main__.Basis1'>, <class '__main__.Basis2'>, <class 'object'>]
Complexe erfelijkheidsgraven volgen hetzelfde principe. Overweeg dit voorbeeld:

# Demonstratie van 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
print(M.mro())
# Uitvoer:
# [<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]
Om dieper in te gaan op het algoritme dat MRO berekent, raadpleeg de officiële Python-documentatie over klasse-erfelijkheid en de discussie over MRO.
Python
- C# Inheritance: Concepten, Types en Praktische Code
- C# Erfelijkheid Beheersen: Herbruikbare, Onderhoudbare Code Bouwen
- Python Datatypes onder de knie krijgen: Een praktische gids
- Python Operators onder de knie krijgen: Een uitgebreide gids
- Python Pass Statement onder de knie krijgen: Een praktische gids
- Python-dictionaries beheersen: aanmaken, manipuleren en geavanceerde technieken
- Python-custom exceptions: een praktische gids
- Python Object-Oriented Programming beheersen: classes, inheritance, encapsulatie & polymorfisme
- Python-erfelijkheid beheersen: concepten, syntax en praktische voorbeelden
- type() en isinstance() in Python begrijpen: praktische voorbeelden
- Python Object-Georiënteerd Programmeren meesteren: Een uitgebreide gids