Différence entre Python self et Java this

J’avais fait un peu de Python depuis longtemps. Je passe cependant à Java maintenant. Je voulais savoir s’il y avait des différences entre la méthode Python “self” et Java “this”.

Je sais que “self” n’est pas un mot-clé alors que “this” est. Et c’est à peu près ce que je pourrais comprendre. Est-ce que je manque autre chose?

À propos de selfself en Python (voici la source: Python auto-explication ):

La raison pour laquelle vous devez vous utiliser. C’est parce que Python n’utilise pas la syntaxe @ pour faire référence aux atsortingbuts d’instance. Python a décidé de faire les méthodes de manière à ce que l’instance à laquelle appartient la méthode soit transmise automatiquement, mais qu’elle ne soit pas reçue automatiquement: le premier paramètre des méthodes est l’instance sur laquelle la méthode est appelée. Cela rend les méthodes entièrement identiques aux fonctions, et laisse le nom à utiliser (même si self est la convention et que les gens vous froncent généralement lorsque vous utilisez autre chose). Self n’est pas spécial pour le code, il est juste un autre object.

Python aurait pu faire autre chose pour distinguer les noms normaux des atsortingbuts – une syntaxe spéciale comme Ruby ou exiger des déclarations comme C ++ et Java, ou peut-être quelque chose de plus différent – mais ce n’est pas le cas. Python est tout pour rendre les choses explicites, ce qui rend évident ce qui est quoi, et bien qu’il ne le fasse pas partout, il le fait par exemple pour les atsortingbuts. C’est pourquoi l’affectation à un atsortingbut d’instance doit savoir à quelle instance atsortingbuer, et c’est pourquoi elle a besoin d’elle- même .

A propos de this en Java étant expliqué par Oracle (voici la source: Java cette explication ):

Dans une méthode d’instance ou un constructeur, il s’agit d’une référence à l’object en cours – l’object dont la méthode ou le constructeur est appelé. Vous pouvez faire référence à n’importe quel membre de l’object actuel depuis une méthode d’instance ou un constructeur en utilisant ceci . La raison la plus courante de l’utilisation du mot-clé this est qu’un champ est masqué par une méthode ou un paramètre constructeur.

Tout d’abord, permettez-moi de vous corriger – le self n’est pas une méthode. Aller plus loin:

Techniquement, les deux sont utilisés pour la même chose. Ils sont utilisés pour accéder à la variable associée à l’instance actuelle. La seule différence est que vous devez inclure explicitement self comme premier paramètre dans une méthode d’instance en Python, alors que ce n’est pas le cas avec Java. De plus, le nom de self peut être n’importe quoi. Ce n’est pas un mot clé, comme vous le savez déjà. vous pouvez même le changer pour this , et cela fonctionnera très bien. Mais les gens aiment utiliser selfself , car c’est devenu un peu une convention.

Voici une méthode d’instance simple permettant d’accéder à une variable d’instance à la fois en Python et en Java:

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

Voir également:

  • Page Wiki de this

Attention, super peut garder sa propre version de this.i en Java , mais self.i se réfère toujours à l’enfant en Python .

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(Ssortingng[] args) { Child m = new Child(); System.out.println(mi); //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(mi) #print 7 m.doStuff() #print 7 m = Main() m.main() 

Sortie:

 $ java Main 7 5 $ python Main.py 7 7 

[Mettre à jour]

La raison en est que la déclaration int i Java dans Child classe Child fait que i deviens une variable d’étendue de classe, alors qu’aucune variable de ce type n’apparaît dans le sous-classement Python. Si vous supprimez int i dans Child classe Child de Java, il imprimera également 7 et 7.