Super() Magic in Python 3.x
In Python 3.x verfügt die super()-Funktion über eine einzigartige Fähigkeit: sie kann ohne Argumente aufgerufen werden. Obwohl dieses Verhalten zunächst überraschend ist, ist es auf eine bewusste Designentscheidung zurückzuführen, die eingeführt wurde, um eine häufige Programmierfalle zu beheben.
Vermeidung von DRY-Verstößen und Mehrdeutigkeit von Klassennamen
Vor Python 3 .x war beim Aufruf von super() eine explizite Benennung der Klasse erforderlich, wie im folgenden Codeausschnitt gezeigt:
<code class="python">class Foo(Bar): def baz(self): return super(Foo, self).baz() + 42</code>
Dieser Ansatz verstieß jedoch gegen das DRY-Prinzip und war anfällig für Mehrdeutigkeiten des Klassennamens, die durch verursacht wurden globales Rebinding oder Klassendekorateure. Um diese Probleme zu mildern, führte Python 3.x eine magische Implementierung von super() ein.
Nutzung einer Klasse-Zelle für die Laufzeitauflösung
The Die aktuelle Implementierung von super() verwendet eine Klasse-Zelle. Diese Zelle bietet Zugriff auf das ursprüngliche Klassenobjekt und ermöglicht super(), die Oberklasse zur Laufzeit aufzulösen, ohne dass eine explizite Klassenbenennung erforderlich ist. Infolgedessen funktioniert der folgende Code wie vorgesehen, auch wenn Foo neu zugewiesen wird:
<code class="python">class Foo(Bar): def baz(self): return super().baz() + 42 Spam = Foo Foo = something_else() Spam().baz() # still works</code>
Kompromiss- und Implementierungsdetails
Ursprünglich wurde super() als vorgeschlagen ein Schlüsselwort, aber Bedenken hinsichtlich der Wahrnehmung als „zu magisch“ führten zur aktuellen Implementierung. Guido van Rossum selbst erkannte die potenzielle Mehrdeutigkeit der Verwendung eines anderen Namens für super().
Potenzielle Nachteile
Während das magische Verhalten von super() im Allgemeinen von Vorteil ist, Dies kann zu unerwarteten Ergebnissen führen, wenn die Superklasse dynamisch geändert oder super() umbenannt wird. In solchen Szenarien ist es ratsam, explizit auf die Variable Klasse in der Methode zu verweisen, um die ordnungsgemäße Funktionalität sicherzustellen.
Alternative Beispiele für Funktionen, die von der Umbenennung betroffen sind
Andere Python-Funktionen und -Methoden, die von der Umbenennung betroffen sein können, sind:
Das obige ist der detaillierte Inhalt vonWie funktioniert „super()' in Python 3.x ohne Argumente?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!