[Python] Grund für das Überschreiben mit super ()

Über diesen Artikel

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.

Was ist ein Override?

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.

Definieren Sie die Basisklasse


#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)

Basisklasse überschreiben (nicht super () verwenden)

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.

Mit super überschreiben ()


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.

Zusammenfassung

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

[Python] Grund für das Überschreiben mit super ()
Python #Funktion 2 für Super-Anfänger
Python #Funktion 1 für Super-Anfänger
Python #Liste für Super-Anfänger
Python für Super-Anfänger Super-Anfänger Python # Wörterbuch Typ 1
Python #index für Super-Anfänger, Slices
[TouchDesigner] Tipps für die Anweisung von Python
Python #len Funktion für Super-Anfänger
[Python] Neunundneunzig Tabellen, die for-Anweisungen verwenden
Python #Hello World für Super-Anfänger
Python für Super-Anfänger Super-Anfänger Python # Wörterbuch Typ 2
Hinweise zur Verwendung von OpenCV mit Windows 10 Python 3.8.3.
Python-Entwicklungsumgebung für macOS mit venv 2016
[50 zählt] Schlüsselübertragung mit Python für Windows
[Python, Multiprocessing] Verhalten für Ausnahmen bei Verwendung von Multiprocessing
Lassen Sie uns Python für Super-Anfänger zusammenstellen
Tipps zur Verwendung von Python + Caffe mit TSUBAME
2016-10-30 sonst für Python3> für:
Python [für mich]
Starten Sie Python
Scraping mit Python
vprof - Ich habe versucht, den Profiler für Python zu verwenden
Python für Super-Anfänger Super-Anfänger Python # Einfach loszuwerden
Python-Pandas: Suchen Sie mit regulären Ausdrücken nach DataFrame
Mit dem Evernote SDK für Python 3 erhalten Sie Informationen zu Notizen
Verbesserte Suche nach Pokemon-Rennwerten mit Python
Einfaches Verständnis von Python für & Arrays (für Super-Anfänger)
Lassen Sie uns mit SWIG ein Modul für Python erstellen
Über den Import von externen Python-Modulen <Für Super-Anfänger>
Lassen Sie uns Covid-19 (Corona) -Daten mit Python analysieren [Für Anfänger]
Über Python für Schleife
Grundeinstellungen für die Verwendung von Python3.8 und pip unter CentOS8
Bearbeiten Sie Redmine mit Python Redmine
Durchsuchen von Pixiv-Tags und Speichern von Illustrationen mit Python
Erweiterbare Skelette für Vim mit Python, Click und Jinja2
Python-Grundlagen ② für Anweisung
Fibonacci-Sequenz mit Python
Verzeichnisstruktur für die testgetriebene Entwicklung mit pytest in python
[Python] Super nützliches Debugging
Methodenüberschreibung und super
[Python] Klassenvererbung (super)
Über Python für ~ (Bereich)
Datenbereinigung mit Python
Python Lehrbuch für Anfänger
Refactoring-Tools, die mit Python verwendet werden können
Verwenden von Python # externen Paketen
WiringPi-SPI-Kommunikation mit Python
Toolchain für Python für Android
Altersberechnung mit Python
Suchen Sie Twitter mit Python
Python # So überprüfen Sie Typ und Typ für Super-Anfänger
Namensidentifikation mit Python
Hinweise zur Verwendung von Python-Unterprozessen
Konstruktionsnotiz für eine maschinelle Lernumgebung von Python
Versuchen Sie es mit Tweepy [Python2.7]
OpenCV für Python-Anfänger
Python Memorandum Super Basic
[Einführung in Python] So schreiben Sie sich wiederholende Anweisungen mit for-Anweisungen
Installieren Sie Python (für Windows)