Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Verwendung und des Funktionsprinzips der Funktion super() in Python

Detaillierte Erläuterung der Verwendung und des Funktionsprinzips der Funktion super() in Python

巴扎黑
巴扎黑Original
2017-08-21 14:57:426161Durchsuche

Die Definition von Objektmethoden in Python ist normalerweise „self“ (entspricht diesem in anderen Sprachen) und wird zum Übergeben des Objekts selbst verwendet. Es muss beim Aufruf nicht explizit übergeben werden. Das System wird automatisch übertragen.

Der Protagonist, den wir heute vorstellen, ist super(). Super() wird sehr häufig bei der Klassenvererbung verwendet. Es löst einige Probleme, wenn die übergeordnete Klasse mehrmals aufgerufen wird Einmal ausgeführt, die Ausführungslogik optimiert, schauen wir uns das unten im Detail an.

Geben Sie ein Beispiel:

class Foo:
  def bar(self, message):
    print(message)
>>> Foo().bar("Hello, Python.")
Hello, Python.

Wenn eine Vererbungsbeziehung besteht, ist es manchmal erforderlich, die Methode der übergeordneten Klasse in der Unterklasse aufzurufen Der einfachste Weg besteht darin, Objektaufrufe in Klassenaufrufe umzuwandeln. Es ist zu beachten, dass der Parameter self zu diesem Zeitpunkt explizit übergeben werden muss, zum Beispiel:

class FooParent:
  def bar(self, message):
    print(message)
class FooChild(FooParent):
  def bar(self, message):
    FooParent.bar(self, message)
>>> FooChild().bar("Hello, Python.")
Hello, Python.

Dies hat einige Nachteile Wenn beispielsweise der Name der übergeordneten Klasse geändert wird, sind viele Änderungen an der Unterklasse erforderlich. Darüber hinaus ist Python eine Sprache, die eine Mehrfachvererbung ermöglicht Vererbung, was umständlich ist. Um diese Probleme zu lösen, hat Python den super()-Mechanismus eingeführt. Der Beispielcode lautet wie folgt:

class FooParent:
  def bar(self, message):
    print(message)
class FooChild(FooParent):
  def bar(self, message):
    super(FooChild, self).bar(message)
>>> FooChild().bar("Hello, Python.")
Hello, Python.

Oberflächlich betrachtet ist super(FooChild, self).bar(message). Methode und FooParent.bar(self , message) Methode sind tatsächlich sehr unterschiedlich. Wenn es um Mehrfachvererbung geht, gibt es direkt ein Beispiel:

Code Eins:

class A:
  def __init__(self):
    print("Enter A")
    print("Leave A")
class B(A):
  def __init__(self):
    print("Enter B")
    A.__init__(self)
    print("Leave B")
class C(A):
  def __init__(self):
    print("Enter C")
    A.__init__(self)
    print("Leave C")
class D(A):
  def __init__(self):
    print("Enter D")
    A.__init__(self)
    print("Leave D")
class E(B, C, D):
  def __init__(self):
    print("Enter E")
    B.__init__(self)
    C.__init__(self)
    D.__init__(self)
    print("Leave E")
E()

Ergebnis:

E eingeben

B eingeben

A eingeben

A verlassen

B verlassen

C eingeben

A eingeben

A verlassen

C verlassen

D eingeben

Geben Sie A ein

Verlassen Sie A

Verlassen Sie D

Verlassen Sie E

Das Einzige, was zu beachten ist, ist Die öffentliche übergeordnete Klasse A wird mehrfach ausgeführt. Zweitklassig.

Code 2:

class A:
  def __init__(self):
    print("Enter A")
    print("Leave A")
class B(A):
  def __init__(self):
    print("Enter B")
    super(B, self).__init__()
    print("Leave B")
class C(A):
  def __init__(self):
    print("Enter C")
    super(C, self).__init__()
    print("Leave C")
class D(A):
  def __init__(self):
    print("Enter D")
    super(D, self).__init__()
    print("Leave D")
class E(B, C, D):
  def __init__(self):
    print("Enter E")
    super(E, self).__init__()
    print("Leave E")
E()

Ergebnis:

E eingeben

B eingeben

C eingeben

D eingeben

A eingeben

A verlassen

D verlassen

C verlassen

B verlassen

E verlassen

Im Supermechanismus wird garantiert, dass die öffentliche übergeordnete Klasse nur einmal ausgeführt wird. Die Ausführungsreihenfolge entspricht der MRO (Method Resolution Order): Methodenauflösungsreihenfolge. Dieser MRO-Mechanismus wird später ausführlich vorgestellt.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung und des Funktionsprinzips der Funktion super() in Python. 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