Heim  >  Artikel  >  Backend-Entwicklung  >  Wie funktioniert „super()“ in Python 3.x ohne Argumente?

Wie funktioniert „super()“ in Python 3.x ohne Argumente?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-27 02:12:30216Durchsuche

 How Does `super()` Work Its Magic in Python 3.x Without Any Arguments?

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:

  • type()
  • isinstance()
  • issubclass()
  • property()
  • classmethod()
  • staticmethod()

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn