1) Pourquoi est-il self
requis comme paramètre explicite dans les signatures de méthode?
Parce que les méthodes sont des fonctions et ne foo.bar(baz)
sont que du sucre syntaxique pour bar(foo, baz)
. Les classes ne sont que des dictionnaires dont certaines valeurs sont des fonctions. (Les constructeurs ne sont également que des fonctions, c'est pourquoi Python n'a pas besoin new
). Vous pouvez dire que Python rend explicite que les objets sont construits à partir de composants plus simples. Ceci est conforme à la philosophie "explicite vaut mieux qu'implicite".
En revanche, en Java, les objets sont vraiment magiques et ne peuvent pas être réduits à des composants plus simples dans le langage. En Java (au moins jusqu'à Java 8), une fonction est toujours une méthode appartenant à un objet, et cette propriété ne peut pas être modifiée en raison de la nature statique du langage. Par conséquent, il n'y a aucune ambiguïté quant à ce qui this
fait référence, il est donc logique de le définir implicitement.
JavaScript est un exemple de langage qui a un implicite this
comme Java, mais où les fonctions peuvent exister séparément des objets comme en Python. Cela conduit à beaucoup de confusion sur ce à quoi se this
réfère lorsque les fonctions sont transmises et appelées dans différents contextes. Beaucoup pensent instinctivement this
doivent se référer à une propriété intrinsèque de la fonction, alors qu'elle est en fait purement déterminée par la façon dont la fonction est appelée. Je crois qu'avoir this
un paramètre explicite comme en Python rendrait cela beaucoup moins déroutant.
Quelques autres avantages du self
paramètre explicite :
Les décorateurs ne sont que des fonctions qui enveloppent d'autres fonctions. Puisque les méthodes ne sont que des fonctions, les décorateurs fonctionnent tout aussi bien sur les méthodes. S'il y avait une sorte de soi implicite, les décorateurs ne travailleraient pas de manière transparente sur les méthodes.
Les méthodes de classe et les méthodes statiques ne prennent pas de paramètre d'instance. Les méthodes de classe prennent une classe comme premier argument (généralement appelé cls
). L'explicite self
ou les cls
paramètres rendent beaucoup plus clair ce qui se passe et ce à quoi vous avez accès dans la méthode.
2) Pourquoi les variables d'instances doivent-elles toujours être qualifiées par " self.
?
En Java, vous n'avez pas besoin de préfixer les variables membres avec " this.
", mais en Python " self.
" est toujours requis. La raison en est que Python n'a pas de syntaxe explicite pour déclarer des variables, il n'y aurait donc aucun moyen de savoir si x = 7
est censé déclarer une nouvelle variable locale ou l'affecter à une variable membre. La spécification self.
résout cette ambiguïté.