Verständnis von Python super() mit __init__() Methoden
Ich versuche, die Verwendung von super()
zu verstehen. So wie es aussieht, können beide Child-Klassen erstellt werden, ganz einfach.
Ich bin neugierig auf den tatsächlichen Unterschied zwischen den folgenden 2 Kind-Klassen zu wissen.
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()
2357
3
Mit
super()
können Sie es vermeiden, sich explizit auf die Basisklasse zu beziehen, was sehr nützlich sein kann. Aber der Hauptvorteil kommt mit der Mehrfachvererbung, wo alle Arten von lustigen Dingen passieren können. Sehen Sie sich die Standarddokumentation zu super an, wenn Sie es nicht schon getan haben.Beachten Sie, dass sich die Syntax in Python 3.0 geändert hat: Sie können einfach
super().__init__()
sagen, anstattsuper(ChildB, self).__init__()
, was IMO ein bisschen netter ist. Die Standard-Dokumente verweisen auch auf eine [Anleitung zur Verwendung von super()] (https://rhettinger.wordpress.com/2011/05/26/super-considered-super/), die ziemlich erklärend ist.Nur eine Vorwarnung... mit Python 2.7, und ich glaube, seit
super()
in Version 2.2 eingeführt wurde, können Siesuper()
nur aufrufen, wenn einer der Elternteile von einer Klasse erbt, die schließlichObject
erbt (new-style classes).Ich persönlich werde, was den Python 2.7 Code angeht, weiterhin
BaseClassName.__init__(self, args)
verwenden, bis ich den Vorteil der Verwendung vonsuper()
sehe.Es gibt eigentlich keine.
super()
schaut sich die nächste Klasse in der MRO (method resolution order, aufgerufen mitcls.__mro__
) an, um die Methoden aufzurufen. Der Aufruf der Basisklasse__init__
ruft einfach die Basisklasse__init__
auf. Zufälligerweise hat die MRO genau ein Element - die Basis. Sie tun also genau das Gleiche, aber auf eine schönere Art und Weise mitsuper()
(besonders wenn Sie später in die Mehrfachvererbung einsteigen).