Ich hatte vor langer Zeit ein bisschen Python gemacht. Ich wechsle aber jetzt zu Java. Ich wollte wissen, ob es Unterschiede zwischen der Python-Methode “self” und der Java-Methode “this” gibt.
Ich weiß, dass „self“ kein Schlüsselwort ist, während „this“ es ist. Und das ist so ziemlich das, was ich herausfinden konnte. Übersehe ich noch etwas?
Was meinst du mit “Selbstmethode”?
– Jayanth Koushik
11. Februar 2014 um 6:45 Uhr
Muss man auch nicht haben self (oder im Fall von Java this) als erster Parameter einer Klassenmethode in Java.
– Wilhelm Gaul
11. Februar 2014 um 6:51 Uhr
Rohit Jain
Lassen Sie mich Sie zunächst korrigieren – self ist keine Methode. Weiter bewegen:
Technisch beides self und this werden für dasselbe verwendet. Sie werden verwendet, um auf die Variable zuzugreifen, die der aktuellen Instanz zugeordnet ist. Der einzige Unterschied ist, dass Sie einschließen müssen self explizit als erster Parameter einer Instanzmethode in Python, während dies bei Java nicht der Fall ist. Außerdem der Name self kann alles sein. Es ist kein Schlüsselwort, wie Sie bereits wissen. Sie können es sogar ändern this, und es wird gut funktionieren. Aber die Leute benutzen es gerne selfda es mittlerweile ein bisschen zu einer Konvention geworden ist.
Hier ist eine einfache Instanzmethode, die sowohl in Python als auch in Java auf eine Instanzvariable zugreift:
Python:
class Circle(object):
def __init__(self, radius):
# declare and initialize an instance variable
self.radius = radius
# Create object. Notice how you are passing only a single argument.
# The object reference is implicitly bound to `self` parameter of `__init__` method
circle1 = Circle(5);
Java:
class Circle {
private int radius;
public Circle(int radius) {
this.radius = radius;
}
}
Circle circle1 = new Circle(5);
Danke, viel hilfreicher als die akzeptierte Antwort zum Kopieren / Einfügen, IMHO
– Adam Hughes
22. August 2015 um 22:09 Uhr
Danke – sehr hilfreiche Antwort, da sie die beiden nebeneinander vergleicht.
– Stelios
12. Oktober 2016 um 15:08 Uhr
Wenn es eine vorhandene Python-Methode gibt, die self nicht als ersten Parameter hat, weil der Autor nicht auf die Attribute der Instanz zugreifen musste und später beschließt, sie wieder hinzuzufügen, führt dies zu einer Abwärtsinkompatibilität? Ich gehe davon aus, dass nein, da jeder Python-Methode automatisch die Selbstinstanz übergeben wird.
– asg
18. Oktober 2017 um 16:01 Uhr
Prägnant und auf den Punkt. Vielen Dank! Besser als die gewählte Antwort
– Leonard
10. Mai 2018 um 9:59 Uhr
Beachten Sie den Unterschied bei Vererbung und Überschreibung, wie von @林果皞 erwähnt. Wenn Sie eine Eltern-Kind-Klassenhierarchie haben, in Java this in parent bezieht sich auf parent, aber in python self in parent bezieht sich auf das Kind.
– zardoscht
17. Dezember 2018 um 19:27 Uhr
Anastasios Vlasopoulos
Um self in Python (hier ist die Quelle: Python-Selbsterklärung):
Der Grund, den Sie verwenden müssen selbst. liegt daran, dass Python die @-Syntax nicht verwendet, um auf Instanzattribute zu verweisen. Python hat sich entschieden, Methoden so auszuführen, dass die Instanz, zu der die Methode gehört, automatisch übergeben, aber nicht automatisch empfangen wird: Der erste Parameter von Methoden ist die Instanz, auf der die Methode aufgerufen wird. Das macht Methoden völlig identisch mit Funktionen und überlässt Ihnen den tatsächlichen Namen (obwohl selbst ist die Konvention, und die Leute werden Sie im Allgemeinen stirnrunzeln, wenn Sie etwas anderes verwenden.) selbst ist nichts Besonderes für den Code, es ist nur ein weiteres Objekt.
Python hätte etwas anderes tun können, um normale Namen von Attributen zu unterscheiden – eine spezielle Syntax, wie sie Ruby hat, oder Deklarationen erfordern, wie es C++ und Java tun, oder vielleicht noch etwas ganz anderes –, aber das tat es nicht. Python ist alles dafür, Dinge explizit zu machen, es offensichtlich zu machen, was was ist, und obwohl es das nicht überall tut, tut es es zum Beispiel für Attribute. Aus diesem Grund muss beim Zuweisen zu einem Instanzattribut bekannt sein, welcher Instanz zugewiesen werden soll, und deshalb muss es sein selbst..
Um this in Java wird von Oracle erklärt (hier ist die Quelle: Java diese Erklärung):
Innerhalb einer Instanzmethode oder eines Konstruktors Dies ist ein Verweis auf das aktuelle Objekt – das Objekt, dessen Methode oder Konstruktor aufgerufen wird. Sie können innerhalb einer Instanzmethode oder eines Konstruktors auf jedes Mitglied des aktuellen Objekts verweisen, indem Sie verwenden Dies. Der häufigste Grund für die Verwendung des Dies Schlüsselwort ist, weil ein Feld von einer Methode oder einem Konstruktorparameter überschattet wird.
林果皞
Vorsichtig sein super kann seine eigene Version von this.i in Java behaltenaber self.i bezieht sich in Python immer auf das Kind.
Main.java:
class Parent {
int i;
Parent() {
this.i = 5;
}
void doStuff() {
System.out.println(this.i);
}
}
class Child extends Parent {
int i;
Child() {
this.i = 7;
}
}
class Main {
public static void main(String[] args) {
Child m = new Child();
System.out.println(m.i); //print 7
m.doStuff(); //print 5
}
}
Main.py:
class Parent(object):
i = 5;
def __init__(self):
self.i = 5
def doStuff(self):
print(self.i)
class Child(Parent, object):
def __init__(self):
super(Child, self).__init__()
self.i = 7
class Main():
def main(self):
m = Child()
print(m.i) #print 7
m.doStuff() #print 7
m = Main()
m.main()
Ausgabe:
$ java Main
7
5
$ python Main.py
7
7
[Update]
Der Grund liegt in Java int i Erklärung ein Child Klasse macht das i Klassenbereichsvariable werden, während es in Python-Unterklassen kein solches Variablen-Shadowing gibt. Wenn Sie entfernen int i in Child Klasse von Java, wird es auch 7 und 7 drucken.
Aus meiner Sicht besteht der offensichtlichste Unterschied darin, dass Sie in der Java-Klasse im Konstruktor das Feld angeben müssen
this.radius = radius
Im Python-Code müssen Sie dies nicht tun, es ist implizit.
12295700cookie-checkUnterschied zwischen Python self und Java thisyes
Was meinst du mit “Selbstmethode”?
– Jayanth Koushik
11. Februar 2014 um 6:45 Uhr
Muss man auch nicht haben
self
(oder im Fall von Javathis
) als erster Parameter einer Klassenmethode in Java.– Wilhelm Gaul
11. Februar 2014 um 6:51 Uhr