[PYTHON] Vergleich von Klassenvererbung und Konstruktorbeschreibung

Einführung

Alles begann, als ich versuchte, Klassen in Python zu erben. Aus der Sicht von mir, der sich bisher mit Java beschäftigt hat Ich dachte, "Was ist das !!!!!!", also in einigen Programmiersprachen Ich habe die Beschreibungsmethode der Klassenvererbung mit der Beschreibungsmethode und dem Verhalten des Konstruktors verglichen.

Diese Haltung

Schreiben, vergleichen, anzeigen und drücken Sie Ihre Eindrücke rund um Java aus.

Ich habe paiza.IO verwendet, um den Betrieb zu überprüfen. Praktisch. https://paiza.io/ja

Beispielspezifikationen

Java Persönlich ist es die Sprache, die ich am besten kenne. Die Version ist Java 12.

Methode zur Beschreibung der Klassenvererbung

Konstruktorbeschreibungsmethode

Stichprobe

Parent.java


public class Parent {
    
    public Parent(){
        System.out.println("★ Übergeordneter Konstruktor");
    }
    
    protected void parentMethod(String message){        
        System.out.println(message);
    }
}

Child.java


public class Child extends Parent{

    public Child(){
        System.out.println("☆ Untergeordneter Konstruktor");
    }

    public void childMethod(String message){       
        System.out.println(message);
        parentMethod("★ Sie können die Parent-Methode aufrufen");
    }
}

Main.java


public class Main {
    public static void main(String[] args) {

        Child child = new Child();
        child.childMethod("☆ Sie können die Child-Methode aufrufen");
    }
}

Ausführungsergebnis (Konsole)

★ Übergeordneter Konstruktor ☆ Untergeordneter Konstruktor ☆ Sie können die Child-Methode aufrufen ★ Sie können die Parent-Methode aufrufen

Impressionen

――Wie schreibe ich eine Klassenvererbung und einen Konstruktor, der am besten zu Ihnen passt?

Python Als nächstes die Gelegenheit, diesen Artikel zu schreiben. Die Version ist Python 3.6.8.

Methode zur Beschreibung der Klassenvererbung

** Klasse ** * Klasse erben * ** (** * Superklasse * **): **

Konstruktorbeschreibungsmethode

** def \ _ \ _ init \ _ \ _ (self ** *, falls vorhanden * **): ** ** Anfangswerteinstellungsprozess zum Beispiel selbst **

** def \ _ \ _ new \ _ \ _ (cls ** *, falls vorhanden * **): ** ** return super (). \ _ \ _ New \ _ \ _ (cls ** *, falls vorhanden * **) **

** * Die folgenden Beispiele, Ausführungsergebnisse (Konsole) und Impressionen beziehen sich auf die Funktion \ _ \ _ init \ _ \ _. ** ** **

Stichprobe

parent.py


class Parent(object):

    def __init__(self):
        print('★ Übergeordneter Konstruktor')

    def parent_function(self, message):
        print(message)

child.py


from parent import Parent

class Child(Parent):

    def __init__(self):
        print('☆ Untergeordneter Konstruktor')

    def child_function(self, message):
        print(message)
        Parent.parent_function(self, '★ Sie können die übergeordnete Funktion aufrufen')

main.py


from child import Child

def main():
    ch = Child()
    ch.child_function('☆ Sie können die untergeordnete Funktion aufrufen')
    

if __name__ == '__main__':
    main()

Ausführungsergebnis (Konsole)

☆ Untergeordneter Konstruktor ☆ Sie können die untergeordnete Funktion aufrufen ★ Sie können die übergeordnete Funktion aufrufen

Impressionen

―― "Nun, verwenden Sie Klammern bei der Klassenvererbung? Ist das Argument nicht falsch?"

child.py


from parent import Parent

class Child(Parent):

    def __init__(self):
        Parent.__init__(self) #Hier hinzugefügt! !! !! !! !! !!
        print('☆ Untergeordneter Konstruktor')

    def child_function(self, message):
        print(message)
        Parent.parent_function(self, '★ Sie können die übergeordnete Funktion aufrufen')

\ _ \ _ New \ _ \ _ Function * (2019/8/16) Hinzugefügt

Anfangs wurde nur die Funktion \ _ \ _ init () \ _ \ _ beschrieben, Da ich Kommentare erhalten habe, habe ich auch die Funktion \ _ \ _ new \ _ \ _ untersucht.

-Die Funktion ** \ _ \ _ new \ _ \ _ funktioniert **, wenn die Instanz erstellt wird, also vor der Funktion ** \ _ \ _ init \ _ \ _ **.

Unten finden Sie die Python 3.7.4-Dokumentation.

Wenn Sie die Funktion \ _ \ _ new \ _ \ _ implementieren, benötigen Sie return super () .__ new __ (cls [, ...]). https://docs.python.org/ja/3/reference/datamodel.html#object.new

Geben Sie in einer typischen Implementierung beim Erstellen einer neuen Instanz einer Klasse die entsprechenden Argumente für super () an. \ _ \ _ New \ _ \ _ (cls [, ...]) und \ _ für die Superklasse. Rufen Sie die Methode \ _new \ _ \ _ () auf, um die erforderlichen Änderungen an der neu erstellten Instanz vorzunehmen, bevor Sie sie zurückgeben.

Es wurde richtig geschrieben (´ ・ ω ・ `) https://docs.python.org/ja/3/reference/datamodel.html#object.init

Wird aufgerufen, nachdem eine Instanz erstellt wurde (von \ _ \ _ new \ _ \ _ ()) und bevor sie an den Aufrufer zurückgegeben wird. Das Argument übergeben Sie an den Konstruktorausdruck der Klasse. Wenn sowohl die Basisklasse als auch ihre abgeleitete Klasse eine \ _ \ _ init \ _ \ _ () -Methode haben, ist die \ _ \ _ init \ _ \ _ () -Methode der abgeleiteten Klasse die \ _ \ _ init \ _ \ _ (). ) Sie müssen die Methode explizit aufrufen, um sicherzustellen, dass der Basisklassenabschnitt der Instanz ordnungsgemäß initialisiert wird. Zum Beispiel super (). \ _ \ _ Init \ _ \ _ ([args ...]).

Es scheint, dass die Funktion \ _ \ _ new \ _ \ _ besser war, wenn sie mit dem Java-Konstruktor ausgerichtet war. ..

Als ich das von der Funktion \ _ \ _ init \ _ \ _ implementierte Beispiel durch die Funktion \ _ \ _ new \ _ \ _ ersetzte, wie es ist, Das Ausführungsergebnis (Konsole) lautet wie folgt. ☆ Untergeordneter Konstruktor ★ Übergeordneter Konstruktor ☆ Sie können die untergeordnete Funktion aufrufen ★ Sie können die übergeordnete Funktion aufrufen

Ruby Durch die mysteriöse Logik, die Python und Ruby. Die Version ist Ruby 2.6.3.

Methode zur Beschreibung der Klassenvererbung

** Klasse ** * Klasse erben * ** <** * Superklasse * end

Konstruktorbeschreibungsmethode

** def initialize (** * falls vorhanden * **) ** end

Stichprobe

parent.rb


class Parent

    def initialize()
        puts "★ Übergeordneter Konstruktor"
    end
    
    def parent_function(message)
        puts message
    end   
end

child.rb


require("./parent.rb")

class Child < Parent

    def initialize()
        puts "☆ Untergeordneter Konstruktor"
    end
    
    def child_function(message)
        puts message
        parent_function("★ Sie können die übergeordnete Funktion aufrufen")
    end
end

main.rb


require("./child.rb")

child = Child.new
child.child_function("☆ Sie können die untergeordnete Funktion aufrufen")

Ausführungsergebnis (Konsole)

☆ Untergeordneter Konstruktor ☆ Sie können die untergeordnete Funktion aufrufen ★ Sie können die übergeordnete Funktion aufrufen

Impressionen

――Es scheint eine Beschreibung zu sein, die das Gefühl der Vererbung der Klasse vermittelt. Es ist Python-ähnlich, dass der Konstruktor eine Funktion mit einem festen Namen ist

child.rb


require("./parent.rb")

class Child < Parent

    def initialize()
        super()  #Hier hinzugefügt! !! !! !! !! !!
        puts "☆ Untergeordneter Konstruktor"
    end
    
    def child_function(message)
        puts message
        parent_function("★ Sie können die übergeordnete Funktion aufrufen")
    end
end

PowerShell In der Schulung für neue Mitarbeiter im Unternehmen gab es ein Thema zum Erstellen eines PowerShell-Skripts, daher habe ich es aufgenommen. In PowerShell (Kiri) gab es keine Klassenvererbung, daher dachte ich darüber nach, daraus eine Pointe zu machen ... **. ** ** ** Dies war nicht auf paiza.IO, also habe ich den Betrieb auf meinem PC überprüft.

Methode zur Beschreibung der Klassenvererbung

** Klasse ** * Klasse erben * : ** * Superklasse * ** { }

Konstruktorbeschreibungsmethode

Stichprobe

parent.psm1


class Parent {

    Parent() {
        write-host("★ Übergeordneter Konstruktor")
    }

    parent_function([String] $message) {

        write-host($message)
    }
}

child.ps1


using module ".\parent.psm1"

class Child : Parent {

    Child(){
         write-host("☆ Untergeordneter Konstruktor")       
    }

    child_function([String] $message) {

        write-host($message)
        ([Parent]$this).parent_function("★ Sie können die übergeordnete Funktion aufrufen")
    }
}

main.ps1


. .\child.ps1

$child = [Child]::new()
$child.child_function("☆ Sie können die untergeordnete Funktion aufrufen")

Ausführungsergebnis (Konsole)

★ Übergeordneter Konstruktor ☆ Untergeordneter Konstruktor ☆ Sie können die untergeordnete Funktion aufrufen ★ Sie können die übergeordnete Funktion aufrufen

Impressionen

schließlich

Abgesehen von Java waren Python, Ruby und PowerShell die Optionen "Ich habe Klassen geschrieben, aber nie verwendet". Ich dachte, ich würde ein paar andere Programmiersprachen ausprobieren, die ich vorher noch nicht berührt hatte. Es tut mir leid, ich bin mit PowerShell erschöpft.

paiza.IO hat also viele verwendbare Programmiersprachen Wenn ich mich besser fühle, möchte ich es hinzufügen, wenn ich andere Dinge versuche. ** Wie auch immer, paiza.IO ist wirklich praktisch. ** ** **

Vergleichen Sie, wie man schreibt Es hat Spaß gemacht, die Eigenschaften jeder Programmiersprache und die Lockerheit meines Verständnisses zu verstehen! Vielen Dank, dass Sie bis zum Ende bei uns bleiben.

Recommended Posts

Vergleich von Klassenvererbung und Konstruktorbeschreibung
Klassenvererbung und Superfunktion
Vergleich von Apex und Lamvery
[Hikari-Python] Kapitel 09-03 Klasse (Vererbung)
Berechnung der selbst erstellten Klasse und der vorhandenen Klasse
Klassenvererbung
Beispiel für die Verwendung von Klassenvariablen und Klassenmethoden
Vergleich von Edelstein, Bündler und Pip, Venv
Vergleich von L1-Regularisierung und Leaky Relu
Geschwindigkeitsvergleich von murmurhash3, md5 und sha1
Vergleichen Sie die Implementierungsbeispiele für scikit-learn und pyclustering k-means
Konstruktor und Destruktor
R- und Python-Schreibvergleich (euklidische Methode der gegenseitigen Teilung)
Allgemeine Beschreibung des CPUFreq-Kerns und der CPUFreq-Benachrichtigungen
[Python] Klassentyp und Verwendung des datetime-Moduls
Zusammenfassung der Pickle- und Unpickle-Verarbeitung von benutzerdefinierten Klassen
Vergleich von Python und Ruby (Environment / Grammar / Literal Edition)
Ein schneller Vergleich der Testbibliotheken von Python und node.js.
DNN (Deep Learning) Library: Vergleich von Chainer und TensorFlow (1)
Vergleich von Windows Server und freiem Linux und kommerziellem Linux
Vergleichstabelle häufig verwendeter Prozesse von Python und Clojure
Beispiel für das Abrufen des Modulnamens und des Klassennamens in Python
Übersicht über klassenbasierte generische Ansichten und geerbte Klassenbeziehungen
Vergleich von CoffeeScript mit JavaScript-, Python- und Ruby-Grammatik
Über Klasse und Instanz
Mehrfachvererbung von Klassen
[Python] Klassenvererbung (super)
Vergleich von LDA-Implementierungen
Vergleich von Online-Klassifikatoren
[Python] Klassenvererbung, überschreiben
Vergleich der Anpassungsprogramme
Klassen- und statische Methoden
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
Vergleich des ungarischen Rechts und der Allzwecklöser für Zuordnungsprobleme