Heim > Artikel > Backend-Entwicklung > Erklärung zum Unterschied zwischen super() und __init__() in Python-Klassen
Wenn Single erbt, sind die von super() und init() implementierten Funktionen ähnlich
class Base(object): def init(self): print 'Base create' class childA(Base): def init(self): print 'creat A ', Base.init(self) class childB(Base): def init(self): print 'creat B ', super(childB, self).init() base = Base() a = childA() b = childB()
Ausgabeergebnis:
Base create creat A Base create creat B Base create
Der Unterschied besteht darin, dass bei Verwendung der super()-Vererbung keine explizite Referenz auf die -Basisklasse erforderlich ist.
Ändern Sie die Basisklasse in eine Klasse im alten Stil, das heißt, sie erbt keine Basisklasse. Wenn
class Base(): def init(self): print 'Base create'
ausgeführt wird, wird beim Initialisieren von b ein Fehler gemeldet:
super(childB, self).init() TypeError: must be type, not classobj
die Vererbungssequenz in die Mehrfachvererbung einbeziehen. entspricht der Rückgabe der nächsten Klasse in der Vererbungssequenz, nicht der übergeordneten Klasse. Eine Funktion ähnlich dieser:
def super(class_name, self): mro = self.class.mro() return mro[mro.index(class_name) + 1]
mro() wird verwendet, um die Vererbungsreihenfolge einer Klasse zu ermitteln. Beispiel:
class Base(object): def init(self): print 'Base create' class childA(Base): def init(self): print 'enter A ' # Base.init(self) super(childA, self).init() print 'leave A' class childB(Base): def init(self): print 'enter B ' # Base.init(self) super(childB, self).init() print 'leave B' class childC(childA, childB): pass c = childC() print c.class.mro
Das Ausgabeergebnis lautet wie folgt:
enter A enter B Base create leave B leave A (<class 'main.childC'>, <class 'main.childA'>, <class 'main.childB'>, <class 'main.Base'>, <type 'object'>)
supder ist nicht mit der übergeordneten Klasse verknüpft, daher ist die Ausführungsreihenfolge A —> B—> —>Base
Der Ausführungsprozess entspricht: beim Initialisieren von childC(), super(childA, self).init() in der Konstruktormethode wird zuerst aufgerufen, super(childA, self) gibt eine Klasse childB nach childA in der Vererbungsreihenfolge der aktuellen Klasse zurück, führt dann childB().init() aus und die Sequenz wird fortgesetzt.
enter A Base create leave A (<class 'main.childC'>, <class 'main.childA'>, <class 'main.childB'>, <class 'main.Base'>, <type 'object'>)Wie aus der super()-Methode ersichtlich ist, kann der erste Parameter von super() ein beliebiger Name in der Vererbungskette sein eine Klasse,
rekursiv auf unbestimmte Zeit;
super() kann wiederholte Aufrufe von
File "test.py", line 12, in init super(childC, self).init() File "test.py", line 12, in init super(childC, self).init() File "test.py", line 12, in init super(childC, self).init() File "test.py", line 12, in init super(childC, self).init() File "test.py", line 12, in init super(childC, self).init() File "test.py", line 12, in init super(childC, self).init() File "test.py", line 12, in init super(childC, self).init() File "test.py", line 12, in init super(childC, self).init() File "test.py", line 12, in init super(childC, self).init() RuntimeError: maximum recursion depth exceeded while calling a Python object
Bases init()-Methode wird zweimal ausgeführt
class Base(object): def init(self): print 'Base create' class childA(Base): def init(self): print 'enter A ' Base.init(self) print 'leave A' class childB(childA, Base): def init(self): childA.init(self) Base.init(self) b = childB()
Mit super() können wiederholte Aufrufe vermieden werden
enter A Base create leave A Base create
Das obige ist der detaillierte Inhalt vonErklärung zum Unterschied zwischen super() und __init__() in Python-Klassen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!