[Python] So erzwingen Sie, dass eine Methode einer Unterklasse einen bestimmten Prozess ausführt

Ich möchte einer Unterklasse einen bestimmten Prozess aufzwingen

Wenn Sie eine Unterklasse entwerfen, die eine bestimmte Klasse in Python erbt, kann es vorkommen, dass das geerbte Ziel diese Art der Verarbeitung ausführt.

Zum Beispiel möchte ich, dass Sie super () .__ init __ () aufrufen, wenn __init __ aufgerufen wird ...

Nicht beschränkt auf "init", der Prozess "Ich möchte die Methode der übergeordneten Klasse überschreiben, aber ich möchte die Methode der übergeordneten Klasse so aufrufen, wie sie ist!" Wird häufig angezeigt, aber ich habe vergessen, den Prozess des Aufrufs der Methode der übergeordneten Klasse zu schreiben. Ich möchte keinen Fehler machen, und die Spezifikation selbst, die die Methode der übergeordneten Klasse aufruft, ist in erster Linie problematisch.

Dieses Mal, wenn die Methode f der untergeordneten Klasse aufgerufen wird, werden wir versuchen, eine Implementierung zu implementieren, bei der die Methode f der übergeordneten Klasse nach der Verarbeitung immer aufgerufen wird.

Weise

** Schreiben Sie "untergeordnete Klassenfunktion f" in "Funktion new_f, die die untergeordnete Klassenfunktion f und die übergeordnete Klassenfunktion f ausführt" um ** Schreiben Sie eine Metaklasse, die das tut

Was ist eine Metaklasse? Die Geschichte wird diesmal anders sein. Stellen Sie sich dies vorerst als eine Klasse vor, die die Art und Weise ändert, wie Klassen definiert werden.

Ich glaube, dass selbst Leute, die nicht damit vertraut sind, alles tun können, indem sie den folgenden Code kopieren und einfügen und die "Dekorations" -Methode neu schreiben.

Annahme

Python: 3.7.2 (Möglicherweise OK für Python3, nur die Metaklassenspezifikationsmethode unterscheidet sich für Python2)

Code

class ParentCaller(type):
    def __new__(cls, name, base, attr):
        #Verhindern Sie, dass f in der übergeordneten Klasse f in der übergeordneten Klasse aufruft
        if name != "Parent":
            #Machen Sie die Funktion f automatisch dekoriert, wenn die Klasse erstellt wird
            attr["f"] = cls.decorate(attr["f"])
        return super().__new__(cls, name, base, attr)

    @classmethod
    def decorate(cls, f):
        #Wenn die Funktion f empfangen wird, f und Parent.Führen Sie f als neuen Satz aus_Rückgabe f
        def new_f(self, x):
            f(self, x)
            Parent.f(self, x)
        return new_f


class Parent(metaclass=ParentCaller):
    def f(self, x):
        print(f"parent's f says: {x}")


class Child(Parent):
    def f(self, x):
        print(f"child's f says: {x}")


child = Child()
child.f("Hello World!")

#  child's f says: Hello World!
#  parent's f says: Hello World!

Zusammenfassung

Wenn ich eine Bibliothek wie Tensorflow schreibe, die von Menschen geerbt und verwendet wird, möchte ich das Versprechen "Run hogehoge here!" So weit wie möglich vermeiden. Schreiben Sie in einem solchen Fall eine Metaklasse und rufen Sie ohne Ihr Wissen hogehoge an.

Es scheint, dass Meta-Programmierung in der Gruppenentwicklung schwer zu lesen und zu hassen ist. Ich denke, dass es eine Essenz ist, die die Anzahl der Schritte für die persönliche Entwicklung minimiert.

Recommended Posts

[Python] So erzwingen Sie, dass eine Methode einer Unterklasse einen bestimmten Prozess ausführt
[Python] Lesen der CSV-Datei (Methode read_csv des Pandas-Moduls)
So schreiben Sie einen Listen- / Wörterbuchtyp von Python3
[Python] So erstellen Sie eine Liste von Zeichenfolgen Zeichen für Zeichen
So mischen Sie einen Teil der Python-Liste (at random.shuffle)
Verwendung der Methode __call__ in der Python-Klasse
Ich habe versucht "Wie man eine Methode in Python dekoriert"
So entwickeln Sie in einer virtuellen Python-Umgebung [Memo]
So erhalten Sie eine Liste der integrierten Ausnahmen für Python
So überschreiben Sie eine benutzerdefinierte Typmethode, die von Python Swig generiert wird
[Python] Wie man PCA mit Python macht
[Python] So löschen Sie eine Zeile / Spalte in einer Tabelle (Liste der Optionen für die Drop-Methode)
Erweitern Sie ein in Python verschachteltes Wörterbuch, um etwas wie Pandas MultiIndex zu tun
So bestimmen Sie die Existenz eines Selenelements in Python
So überprüfen Sie die Speichergröße einer Variablen in Python
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
[Python] Wie erstelle ich eine Matrix aus sich wiederholenden Mustern (repmat / tile)
[Python] Zusammenfassung der Verwendung von Pandas
[Python] Wie man eine Klasse iterierbar macht
So machen Sie R chartr () in Python
[Python] So konvertieren Sie eine zweidimensionale Liste in eine eindimensionale Liste
[Python] So invertieren Sie eine Zeichenfolge
Wie bekomme ich Stacktrace in Python?
Wie man einen Taschentest mit Python macht
[Python2.7] Zusammenfassung der Verwendung von unittest
Zusammenfassung der Verwendung der Python-Liste
[Python2.7] Zusammenfassung der Verwendung des Unterprozesses
[Python] Verwendung der for-Anweisung. Eine Methode zum Extrahieren durch Angabe eines Bereichs oder von Bedingungen.
So führen Sie Maya Python-Skripte aus
[Frage] Wie verwende ich plot_surface von Python?
So senden Sie ein visualisiertes Bild der in Python erstellten Daten an Typetalk
[Python] So fügen Sie eine beliebige Anzahl von Standardeingaben in die Liste ein
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
So formatieren Sie eine Liste von Wörterbüchern (oder Instanzen) in Python
So stoppen Sie das Programm bis zu einem bestimmten Datum und einer bestimmten Uhrzeit in Python
So berechnen Sie die Volatilität einer Marke
Lesen einer CSV-Datei mit Python 2/3
[Python] Verwendung von zwei Arten von type ()
So öffnen Sie einen Webbrowser über Python
So löschen Sie einen Taple in einer Liste (Python)
So führen Sie eine Mehrkern-Parallelverarbeitung mit Python durch
Einbetten von Variablen in Python-Strings
Zusammenfassung zum Importieren von Dateien in Python 3
So erstellen Sie eine JSON-Datei in Python
So generieren Sie ein Python-Objekt aus JSON
Zusammenfassung der Verwendung von MNIST mit Python
So fügen Sie einen Suchpfad für Python-Module hinzu
So legen Sie Attribute mit Mock of Python fest
So benachrichtigen Sie Discord-Kanäle in Python
So erhalten Sie Elemente vom Typ Wörterbuch von Python 2.7
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
So zählen Sie Zahlen in einem bestimmten Bereich
Wie kann man in Go so etwas wie eine Liste von void * (oder Variantentypen) erreichen?
[Circuit x Python] So ermitteln Sie die Übertragungsfunktion eines Schaltkreises mit Lcapy
[Python] So sortieren Sie nach dem N-ten M-ten Element eines mehrdimensionalen Arrays
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
Memo mit Python mit HiveServer2 von EMR verbunden