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.
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
Java Persönlich ist es die Sprache, die ich am besten kenne. Die Version ist Java 12.
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");
}
}
★ Übergeordneter Konstruktor ☆ Untergeordneter Konstruktor ☆ Sie können die Child-Methode aufrufen ★ Sie können die Parent-Methode aufrufen
――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.
** Klasse ** * Klasse erben * ** (** * Superklasse * **): **
** 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 \ _ \ _. ** ** **
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()
☆ Untergeordneter Konstruktor ☆ Sie können die untergeordnete Funktion aufrufen ★ Sie können die übergeordnete Funktion aufrufen
―― "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')
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.
** Klasse ** * Klasse erben * ** <** * Superklasse * end
** def initialize (** * falls vorhanden * **) ** end
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")
☆ Untergeordneter Konstruktor ☆ Sie können die untergeordnete Funktion aufrufen ★ Sie können die übergeordnete Funktion aufrufen
――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
super
auch die Initialisierungsfunktion von Parent auschild.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.
** Klasse ** * Klasse erben * : ** * Superklasse * ** { }
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")
★ Übergeordneter Konstruktor ☆ Untergeordneter Konstruktor ☆ Sie können die untergeordnete Funktion aufrufen ★ Sie können die übergeordnete Funktion aufrufen
using module
aufgerufen werden
――Ich muss die Erweiterung ändern ... warum? ?? ?? $ this
mit der Superklasse umgewandelt wird" **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