Als ich mir den Django-Quellcode ansah, fand ich viele, die super ()
verwendeten, um die Klasse zu überschreiben. Lassen Sie uns herausfinden, was "super ()" ist und was sich davon unterscheidet, es zu überschreiben, ohne es zu verwenden.
So definieren Sie eine Methode mit demselben Namen wie die Basisklasse in der abgeleiteten Klasse. Sie können den Methoden der Basisklasse Funktionen hinzufügen oder ändern.
#Basisklasse
class Coffee(object):
def __init__(self, color, fragrance, price, taste, elapsed_time):
self.color = color
self.fragrance = fragrance
self.price = price
self.satisfaction = ((taste + fragrance) * price) - elapsed_time
def drink(self):
print(f'Befriedigung{self.satisfaction}Trinken Sie Hoffy auf den Punkt')
coffee = Coffee('brown', 10, 200, 10, 300)
coffee.drink() # <---Trinken Sie Hoffy mit 3700 Zufriedenheitspunkten
Nachdem wir die Basisklasse definiert haben, erstellen wir unten eine abgeleitete Klasse mit und ohne "super ()". (Beide haben die gleiche Funktion)
Erstellen wir eine Klasse, die die Klasse "Coffee" erbt und die Methode überschreibt.
#Nach der Übernahme von Coffee möchte ich die Funktion erweitern! !!
class Override(Coffee):
#Wenn Sie es normal überschreiben, wird die Verarbeitung der Basisklasse ungültig. Wenn Sie also die Verarbeitung erweitern möchten, müssen Sie dieselbe Verarbeitung wie die Basisklasse schreiben.
def __init__(self, color, fragrance, price, taste, elapsed_time, size):
self.color = color
self.fragrance = fragrance
self.price = price
self.satisfaction = ((taste + fragrance) * price) - elapsed_time + size * 55
self.size = size
def size_up(self):
self.price += 100
self.size += 1
print(f'Größe ist{self.size}Wurde! Stattdessen stieg der Preis...')
#Die Basisklassenmethode muss ebenfalls von Grund auf neu definiert werden
def drink(self):
print(f'Befriedigung{self.satisfaction}Trinken Sie Hoffy auf den Punkt')
print(f'Größe ist{self.size}War etwas zu viel...')
#Ausführungsergebnis Normale Überschreibung
override = Override('brown', 10, 200, 10, 300, 10)
override.drink() # <---Trinken Sie Hoffy mit 4250 Punkten Zufriedenheit,Ich frage mich, ob Größe 10 etwas zu viel war..
override.size_up() # <---Die Größe ist jetzt 11! Stattdessen stieg der Preis....
Die Methoden __init __ ()
und drink ()
der Basisklasse wurden überschrieben.
Wenn Sie es normal überschreiben, wird die Verarbeitung der Basisklasse ungültig. Wenn Sie also nur die Verarbeitung erweitern möchten, müssen Sie dieselbe Verarbeitung wie die Basisklasse schreiben, was zu redundantem Code führt.
class SuperOverride(Coffee):
#Wenn Sie den Basisklassenkonstruktor mit der Super-Funktion aufrufen, müssen Sie den Initialisierungscode nicht mehr schreiben.
def __init__(self, color, fragrance, price, taste, elapsed_time, size):
super().__init__(color, fragrance, price, taste, elapsed_time,)
self.size = size
def size_up(self):
self.price += 100
self.size += 1
print(f'Größe ist{self.size}Wurde! Stattdessen stieg der Preis...')
#Basisklassenmethoden werden aufgerufen, daher besteht Redundanz
def drink(self):
super().drink()
print(f'Größe ist{self.size}War etwas zu viel...')
#Ausführungsergebnis super()Mit Funktionen überschreiben
super_override = SuperOverride('brown', 10, 200, 10, 300, 10)
super_override.drink() # <---Trinken Sie Hoffy mit 4250 Punkten Zufriedenheit,Ich frage mich, ob Größe 11 etwas zu viel war...
super_override.size_up() # <---Die Größe ist jetzt 12! Stattdessen stieg der Preis...
Der an die Parameter (Farbe, Duft, Preis, Geschmack, verstrichene Zeit) der Methode "init" von SuperOverride übergebene Wert wird den Parametern der Basisklasse (Kaffee) zugewiesen und initialisiert. Da die Basisklassenmethode vollständig mit super () aufgerufen wird, wird auch die Zufriedenheit vererbt.
Beachten Sie, dass "super (). Drink ()" gleichbedeutend ist mit "super (SuperOverride self) .drink ()". Mit anderen Worten, Sie können "super (eigene Klasse, selbst) .Methodenname" schreiben, aber Sie können es wie im obigen Code weglassen.
Wie oben erwähnt, können Sie die Beschreibung speichern und das Lesen des Codes vereinfachen, indem Sie "super ()" verwenden, wenn Sie die Verarbeitung nach dem Erben der Methode der Basisklasse erweitern möchten.
Recommended Posts