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()
Lösung

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, anstatt super(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.

Kommentare (5)

Nur eine Vorwarnung... mit Python 2.7, und ich glaube, seit super() in Version 2.2 eingeführt wurde, können Sie super() nur aufrufen, wenn einer der Elternteile von einer Klasse erbt, die schließlich Object 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 von super() sehe.

Kommentare (2)

Es gibt eigentlich keine. super() schaut sich die nächste Klasse in der MRO (method resolution order, aufgerufen mit cls.__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 mit super() (besonders wenn Sie später in die Mehrfachvererbung einsteigen).

Kommentare (6)