I'm próbuje zrozumieć użycie super()
. Z tego co widzę, obie klasy dzieci mogą być tworzone, po prostu dobrze.
Jestem ciekaw, jaka jest rzeczywista różnica między następującymi 2 klasami dzieci.
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()
Funkcja super()
pozwala ci uniknąć odwoływania się do klasy bazowej wprost, co może być miłe. Ale główna zaleta przychodzi z wielokrotnym dziedziczeniem, gdzie wszystkie rodzaje zabawnych rzeczy mogą się zdarzyć. Zobacz standardowe dokumenty na temat super, jeśli jeszcze tego nie zrobiłeś.
Zauważ, że składnia zmieniła się w Pythonie 3.0: możesz po prostu powiedzieć super().__init__()
zamiast super(ChildB, self).__init__()
, co IMO jest całkiem ładniejsze. Standardowe docs odnoszą się również do guide to using super(), który jest dość objaśniający.
Po prostu uwaga... w Pythonie 2.7, i wierzę, że od kiedy super()
został wprowadzony w wersji 2.2, możesz wywołać super()
tylko wtedy, gdy jeden z rodziców dziedziczy po klasie, która ostatecznie dziedziczy po object
(new-style classes).
Osobiście, jeśli chodzi o kod Pythona 2.7, zamierzam nadal używać BaseClassName.__init__(self, args)
, dopóki faktycznie nie dostanę korzyści z używania super()
.
Nie ma'adnej, naprawdę. Funkcja super()
patrzy na następną klasę w MRO (method resolution order, dostęp z cls.__mro__
) aby wywołać metody. Po prostu wywołanie bazowego __init__
wywołuje bazowe __init__
. Tak się składa, że MRO ma dokładnie jeden element - bazę. Więc tak naprawdę robisz dokładnie to samo, ale w ładniejszy sposób za pomocą super()
(szczególnie jeśli później zajmiesz się dziedziczeniem wielokrotnym).