Heim  >  Artikel  >  Backend-Entwicklung  >  super()-Methode in Python

super()-Methode in Python

不言
不言Original
2018-06-01 16:36:221556Durchsuche

In diesem Artikel wird hauptsächlich die super()-Methode in Python vorgestellt, die einen bestimmten Referenzwert hat. Jetzt können Freunde in Not darauf verweisen.

Super wird zur Lösung mehrerer Vererbungsprobleme verwendet Wenn Sie die Methode der übergeordneten Klasse direkt über den Klassennamen aufrufen, ist dies kein Problem, wenn Sie die Einzelvererbung verwenden. Wenn Sie jedoch die Mehrfachvererbung verwenden, treten verschiedene Probleme auf, z. B. die Suchreihenfolge (MRO) und wiederholte Aufrufe (Diamantvererbung). Dieser Artikel führt Sie hauptsächlich in die relevanten Informationen zur super()-Methode in Python ein. Freunde, die sie benötigen, können darauf zurückgreifen.

Vorwort

Python-Klassen umfassen Klassen neuen Stils und klassische Klassen, die beide Mehrfachvererbung unterstützen. Wenn Sie bei der Klassenvererbung die Methode der übergeordneten Klasse überschreiben möchten, anstatt die Methode der übergeordneten Klasse zu überschreiben, können wir zu diesem Zeitpunkt die Methode super () verwenden, um dies zu erreichen.

Python-Sprache und C++ haben eine ähnliche Klassenvererbung Wenn die Klasse definiert ist, wird das erste Selbst in Python angepasst, ähnlich dem Zeiger this in C++, der auf das Objekt selbst zeigt.

Beispiel einer einfachen Python-Klasse:

>>> class hello(object): 
...     def print_c(): 
...       print"hello world!" 
>>> hello().print_c() 
hello world!

Natürlich ist in der Praxis zwangsläufig eine Klassenvererbung erforderlich. Unterklassen Die Klasse erbt die übergeordnete Klasse, normalerweise wie folgt:

>>> class child(hello): 
...     def print_c(self): 
...         hello().print_c() 
...          
>>> child().print_c() 
hello world!

Der super()-Mechanismus wird auch in Python bereitgestellt, das Beispiel ist wie folgt :

>>> class hello(object): 
...     def print_c(self): 
...       print"hello world!" 
...        
>>> class child(hello): 
...     def print_c(self): 
...         super(child,self).print_c() 
...          
>>> child().print_c() 
hello world!

Hinweis

Versionen vor Python 2.2: klassisch Klassenära

Eine klassische Klasse ist eine Klasse ohne Vererbung. Die Instanztypen sind alle Typtypen. Wenn eine klassische Klasse als übergeordnete Klasse verwendet wird, wird ein solcher Fehler zurückgegeben, wenn die Unterklasse aufruft Konstruktor der übergeordneten Klasse ''' TypeError: muss Typ sein, nicht classobj''

Zu diesem Zeitpunkt ist die MRO-Methode DFS (Tiefensuche zuerst (Reihenfolge der untergeordneten Knoten: von links nach rechts)) ). Daher werden in diesem Artikel Klassen neuen Stils verwendet, und der Suchalgorithmus für Klassen neuen Stils ist der C3-Algorithmus

class C(object):
 def minus(self,x):
  return x/2

class D(C):
 def minus(self,x):
  super(D, self).minus()
  print 'hello'

Oben Code, C ist die übergeordnete Klasse und D ist eine Unterklasse. Wir haben die Minus-Methode in Klasse D neu definiert, die eine neue Druckfunktion „Hallo“ basierend auf den Funktionen der Klasse C hinzufügt. Die Rolle von super besteht hier darin, die Methode der übergeordneten Klasse in der Unterklasse aufzurufen. Dies ist auch eine häufige Verwendung des Aufrufs von super() bei der Einzelvererbung. Hier kommt also die Frage

class A(object):
 def __init__(self):
  self.n = 10

 def minus(self, m):
  self.n -= m


class B(A):
 def __init__(self):
  self.n = 7

 def minus(self, m):
  super(B,self).minus(m)
  self.n -= 2
b=B()
b.minus(2)
print b.n

Was ist also die Ausgabe von b.n im obigen Code? Warum ist das Ergebnis 2 statt 5? super(B,self).minus(m) ruft offensichtlich die Minus-Methode der übergeordneten Klasse auf, aber das Ausgabeergebnis ist 2. Sie müssen verstehen, dass die aktuelle Instanz von B, nicht die Instanz von A, dann der Wert von self ist .n bestanden Es ist 7, nicht 10.

Wie funktioniert Super also, wenn es eine Mehrfachvererbung gibt? Kommen Sie, erstellen Sie jetzt eine Klasse C, die A erbt, und erstellen Sie dann eine Klasse D, die B und C erbt. Sehen Sie, wie Sie die superüberschriebene Methode aufrufen.

class C(A):
 def __init__(self):
  self.n = 12

 def minus(self, m):
  super(C,self).minus(m)
  self.n -= 5


class D(B, C):
 def __init__(self):
  self.n = 15

 def minus(self, m):
  super(D,self).minus(m)
  self.n -= 2

d=D()
d.minus(2)
print d.n

Was ist das Ausgabeergebnis des obigen Codes? Seien Sie nicht ungeduldig, schauen Sie einfach erst einmal, wie es funktioniert. Wie oben erwähnt, verwendet die neue Klasse den C3-Algorithmus bei der Suche nach untergeordneten Knoten. Wie wird es gefunden? D->B->C->A->Objekt. Wie kann ich überprüfen, ob diese Reihenfolge korrekt ist?

D.__mro__
(<class &#39;__main__.D&#39;>, <class &#39;__main__.B&#39;>, <class &#39;__main__.C&#39;>, <class &#39;__main__.A&#39;>, <type &#39;object&#39;>)

Was ist Mro? Für jede von Ihnen definierte Klasse berechnet Python eine MRO-Liste (Method Resolution Order), die die Reihenfolge der Klassenvererbung darstellt.

Verwandte Empfehlungen:

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

Das obige ist der detaillierte Inhalt vonsuper()-Methode 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