Ik probeer het gebruik van super()
te begrijpen. Zo te zien kunnen beide child classes gewoon gemaakt worden.
Ik'ben benieuwd naar het werkelijke verschil tussen de volgende 2 child classes.
class Base(object):
def __init__(self):
print "Base created"
class ChildA(Base):
def __init__(self):
Base.__init__(self)
class ChildB(Base):
def __init__(self):
super(ChildB, self).__init__()
ChildA()
ChildB()
Met super()
kun je voorkomen dat je expliciet naar de basisklasse moet verwijzen, wat leuk kan zijn. Maar het grootste voordeel komt met meervoudige overerving, waar allerlei leuke dingen kunnen gebeuren. Zie de standaard docs over super als je dat nog niet gedaan hebt.
Merk op dat de syntaxis veranderd is in Python 3.0: je kunt gewoon super().__init__()
zeggen in plaats van super(ChildB, self).__init__()
, wat IMO een stuk mooier is. De standaarddocs verwijzen ook naar een guide to using super() die vrij verhelderend is.
Even een heads up... met Python 2.7, en ik geloof sinds super()
werd geïntroduceerd in versie 2.2, kun je alleen super()
aanroepen als een van de ouders erft van een klasse die uiteindelijk object
erft (nieuwe-stijl-klassen).
Persoonlijk, wat python 2.7 code betreft, ga ik'BaseClassName.__init__(self, args)
blijven gebruiken totdat ik daadwerkelijk het voordeel van super()
gebruik.
Dat is er niet, eigenlijk. super()
kijkt naar de volgende klasse in de MRO (method resolution order, benaderd met cls.__mro__
) om de methodes aan te roepen. Alleen het aanroepen van de basis __init__
roept de basis __init__
aan. Toevallig heeft de MRO precies één item - de basis. Je doet dus eigenlijk precies hetzelfde, maar op een mooiere manier met super()
(vooral als je later aan meervoudige overerving gaat doen).