744 Stimmen

Was bewirkt 'super' in Python? - Unterschied zwischen super().__init__() und explizitem superclass __init__()

Was ist der Unterschied zwischen:

class Child(SomeBaseClass):
    def __init__(self):
        super(Child, self).__init__()

und:

class Child(SomeBaseClass):
    def __init__(self):
        SomeBaseClass.__init__(self)

Ich habe gesehen super wird häufig in Klassen mit nur einfacher Vererbung verwendet. Ich kann verstehen, warum Sie es in der Mehrfachvererbung verwenden würden, aber mir ist nicht klar, was die Vorteile der Verwendung in dieser Art von Situation sind.

0voto

dorisxx Punkte 1
class Child(SomeBaseClass):
    def __init__(self):
        SomeBaseClass.__init__(self)

Das ist recht einfach zu verstehen.

class Child(SomeBaseClass):
    def __init__(self):
        super(Child, self).__init__()

Ok, was passiert nun, wenn Sie super(Child,self) ?

Wenn eine Child-Instanz erstellt wird, ist ihre MRO (Method Resolution Order) in der Reihenfolge (Child, SomeBaseClass, object) basierend auf der Vererbung. (angenommen, SomeBaseClass hat keine anderen Eltern außer dem Standardobjekt)

Im Vorbeigehen Child, self , super Recherchen in der MRO des self Instanz, und geben Sie das Proxy-Objekt neben Child zurück, in diesem Fall SomeBaseClass, dieses Objekt ruft dann die __init__ Methode von SomeBaseClass. Mit anderen Worten, wenn es sich um super(SomeBaseClass,self) das Proxy-Objekt, das super Die Rendite wäre object

Bei der Mehrfachvererbung kann das MRO viele Klassen enthalten, so dass grundsätzlich super können Sie entscheiden, wo Sie die Suche in der MRO beginnen möchten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X