Unterschied zwischen Python self und Java this

Lesezeit: 5 Minuten

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

Benutzer-Avatar
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);

Siehe auch:

  • 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


Benutzer-Avatar
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.

Benutzer-Avatar
林果皞

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.

1229570cookie-checkUnterschied zwischen Python self und Java this

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy