J'ai appris Python en suivant quelques tutoriels pygame .
J'y ai trouvé une utilisation intensive du mot-clé self , et venant d'un fond principalement Java, je constate que j'oublie toujours de taper self . Par exemple, au lieu de self.rect.centerx
je taperais rect.centerx
, car, pour moi, rect est déjà une variable membre de la classe.
Le parallèle Java auquel je peux penser pour cette situation est de devoir préfixer toutes les références aux variables membres avec ceci .
Suis-je bloqué en préfixant toutes les variables membres avec self , ou y a-t-il un moyen de les déclarer qui me permettrait d'éviter d'avoir à le faire?
Même si ce que je suggère n'est pas pythonique , j'aimerais quand même savoir si c'est possible.
J'ai jeté un coup d'œil à ces questions SO connexes, mais elles ne répondent pas tout à fait à ce que je recherche:
m_
préfixe pour tous les noms de membres observés par certains programmeurs C ++ / Java? L'utilisation deself.
facilite la lisibilité d'une manière similaire. Vous devriez également lire dirtsimple.org/2004/12/python-is-not-java.html .m_
utilisé pour les membres de données non statiques non publics uniquement (au moins en C ++).mVariableName
, pour les variables membres, lors du codage en Java. Je pense que le commentaire de @ Anurag résume assez bien la situation, pour ce qu'un développeur Java devrait faire lorsqu'il apprend python.Réponses:
Python nécessite de spécifier soi-même. Le résultat est qu'il n'y a jamais de confusion sur ce qui est un membre et ce qui ne l'est pas, même sans la définition complète de la classe visible. Cela conduit à des propriétés utiles, telles que: vous ne pouvez pas ajouter de membres qui occultent accidentellement des non-membres et interrompent ainsi le code.
Un exemple extrême: vous pouvez écrire une classe sans aucune connaissance des classes de base qu'elle pourrait avoir, et toujours savoir si vous accédez à un membre ou non:
C'est le code complet ! (some_function renvoie le type utilisé comme base.)
Un autre, où les méthodes d'une classe sont composées dynamiquement:
N'oubliez pas que ces deux exemples sont extrêmes et que vous ne les verrez pas tous les jours, et je ne suggère pas non plus que vous devriez souvent écrire du code comme celui-ci, mais ils montrent clairement que les aspects de soi sont explicitement requis.
la source
self
.__shadow__ myFieldName
. Cela empêcherait également l'observation accidentelle, n'est-ce pas?Les réponses précédentes sont toutes fondamentalement des variantes de «vous ne pouvez pas» ou «vous ne devriez pas». Bien que je sois d'accord avec ce dernier sentiment, la question reste techniquement sans réponse.
En outre, il existe des raisons légitimes pour lesquelles quelqu'un pourrait vouloir faire quelque chose dans le sens de ce que la question pose. Une chose que je rencontre parfois est de longues équations mathématiques où l'utilisation de noms longs rend l'équation méconnaissable. Voici quelques façons de procéder dans un exemple en conserve:
Le troisième exemple - c'est-à-dire l'utilisation
for k in self.__dict__ : exec(k+'= self.'+k)
est essentiellement ce que la question demande réellement, mais laissez-moi être clair que je ne pense pas que ce soit généralement une bonne idée.Pour plus d'informations et pour parcourir les variables de classe, ou même les fonctions, consultez les réponses et la discussion à cette question . Pour une discussion sur d'autres façons de nommer dynamiquement des variables, et pourquoi ce n'est généralement pas une bonne idée, consultez cet article de blog .
MISE À JOUR: Il semble qu'il n'y ait aucun moyen de mettre à jour ou de modifier dynamiquement les paramètres locaux d'une fonction dans Python3, donc calc3 et les variantes similaires ne sont plus possibles. La seule solution compatible python3 à laquelle je puisse penser maintenant est d'utiliser
globals
:Ce qui, encore une fois, serait une pratique terrible en général.
la source
locals
au lieu d'utiliserexec
?locals().update(self.__dict__)
en python 2 et 3, mais cela n'a pas fonctionné. En python3, même l'astuce «exec» n'est plus une option. D'un autre côté,globals().update(self.__dict__)
ça marche, mais ce serait une pratique terrible en général.En fait, ce
self
n'est pas un mot-clé, c'est juste le nom conventionnellement donné au premier paramètre des méthodes d'instance en Python. Et ce premier paramètre ne peut pas être ignoré, car c'est le seul mécanisme dont dispose une méthode pour savoir sur quelle instance de votre classe elle est appelée.la source
Vous pouvez utiliser le nom de votre choix, par exemple
ou même
mais vous êtes coincé avec l'utilisation d'un nom pour la portée.
Je ne vous recommande pas d'utiliser quelque chose de différent de vous-même, sauf si vous avez une raison convaincante, car cela le rendrait étranger pour les pythonistes expérimentés.
la source
self
, et vous devez suivre la convention. Cela rendra votre code plus facile à comprendre pour tout programmeur Python expérimenté qui l'examinera. (Cela inclut vous, dans six mois, en essayant de comprendre ce que fait votre ancien programme!)def function(_, variable): _.variable = variable
def funcion(*args): args[0].variable = args[1]
oui, vous devez toujours spécifier
self
, car explicite vaut mieux qu'implicite, selon la philosophie de python.Vous découvrirez également que la façon dont vous programmez en python est très différente de la façon dont vous programmez en java, d'où l'utilisation de a
self
tendance à diminuer car vous ne projetez pas tout à l'intérieur de l'objet. Au contraire, vous utilisez davantage la fonction au niveau du module, qui peut être mieux testée.au fait. Je détestais ça au début, maintenant je déteste le contraire. idem pour le contrôle de flux indenté.
la source
self
en aucune façon. Alors, quel est l'intérêt de les avoir dans la classe?Le «self» est l'espace réservé conventionnel de l'instance d'objet courante d'une classe. Il est utilisé lorsque vous voulez faire référence à la propriété, au champ ou à la méthode de l'objet à l'intérieur d'une classe comme si vous faisiez référence à «lui-même». Mais pour raccourcir les choses, quelqu'un dans le domaine de la programmation Python a commencé à utiliser "self", d'autres royaumes utilisent "this" mais ils en font un mot-clé qui ne peut pas être remplacé. J'ai plutôt utilisé "son" pour augmenter la lisibilité du code. C'est l'une des bonnes choses de Python - vous avez la liberté de choisir votre propre espace réservé pour l'instance de l'objet autre que "self". Exemple pour soi:
Maintenant, nous remplaçons 'self' par 'its':
qui est plus lisible maintenant?
la source
s
(ou une autre lettre unique) au lieu deits
s
a la même signification: un alias de l'instance de classe. je devrais rechercher ce queits
signifie dans le contexte tout de mêmeself fait partie de la syntaxe python pour accéder aux membres des objets, donc j'ai peur que vous soyez coincé
la source
En fait, vous pouvez utiliser la recette "Auto implicite" de la présentation d'Armin Ronacher "5 ans de mauvaises idées" (google it).
C'est une recette très intelligente, comme presque tout d'Armin Ronacher, mais je ne pense pas que cette idée soit très attrayante. Je pense que je préférerais cela explicite en C # / Java.
Mettre à jour. Lien vers "recette de mauvaise idée": https://speakerdeck.com/mitsuhiko/5-years-of-bad-ideas?slide=58
la source
def method(
<del> self </del>)
, maisself.variable
est toujours nécessaire avec ce hack astucieux.Ouais, le moi est fastidieux. Mais est-ce mieux?
la source
_
a une signification particulière dans le shell Python, où il contient la dernière valeur renvoyée. C'est sûr de l'utiliser comme ça, mais potentiellement déroutant; Je l'éviterais.s
oum
(pour imiter C ++)De: Self Hell - Plus de fonctions avec état.
la source
__str__
, etc.) car elles sont invoquées différemment des méthodes normales.Je pense que ce serait plus facile et plus lisible s'il y avait une instruction «membre» tout comme il y a «global» pour que vous puissiez dire à l'interpréteur quels sont les objets membres de la classe.
la source