Les réponses précédentes sont toutes 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 allant dans le sens de ce que la question actuelle demande. Je rencontre parfois de longues équations mathématiques pour lesquelles l'utilisation de noms longs rend l'équation méconnaissable. Voici quelques façons de procéder dans un exemple concret :
import numpy as np
class MyFunkyGaussian() :
def __init__(self, A, x0, w, s, y0) :
self.A = float(A)
self.x0 = x0
self.w = w
self.y0 = y0
self.s = s
# The correct way, but subjectively less readable to some (like me)
def calc1(self, x) :
return (self.A/(self.w*np.sqrt(np.pi))/(1+self.s*self.w**2/2)
* np.exp( -(x-self.x0)**2/self.w**2)
* (1+self.s*(x-self.x0)**2) + self.y0 )
# The correct way if you really don't want to use 'self' in the calculations
def calc2(self, x) :
# Explicity copy variables
A, x0, w, y0, s = self.A, self.x0, self.w, self.y0, self.s
sqrt, exp, pi = np.sqrt, np.exp, np.pi
return ( A/( w*sqrt(pi) )/(1+s*w**2/2)
* exp( -(x-x0)**2/w**2 )
* (1+s*(x-x0)**2) + y0 )
# Probably a bad idea...
def calc3(self, x) :
# Automatically copy every class vairable
for k in self.__dict__ : exec(k+'= self.'+k)
sqrt, exp, pi = np.sqrt, np.exp, np.pi
return ( A/( w*sqrt(pi) )/(1+s*w**2/2)
* exp( -(x-x0)**2/w**2 )
* (1+s*(x-x0)**2) + y0 )
g = MyFunkyGaussian(2.0, 1.5, 3.0, 5.0, 0.0)
print(g.calc1(0.5))
print(g.calc2(0.5))
print(g.calc3(0.5))
Le troisième exemple - c'est-à-dire l'utilisation de for k in self.__dict__ : exec(k+'= self.'+k)
est en fait ce que la question demande, mais laissez-moi être clair : je ne pense pas que ce soit une bonne idée en général.
Pour plus d'informations, et pour connaître les moyens d'itérer à travers les variables de classe, ou même les fonctions, voir les réponses et la discussion sur cette question . Pour une discussion sur les autres façons de nommer dynamiquement des variables, et sur les raisons pour lesquelles ce n'est généralement pas une bonne idée, voir cet article de blog .
UPDATE : Il semble y avoir pas du tout pour mettre à jour ou changer dynamiquement les locales d'une fonction dans Python3, donc calc3 et les variantes similaires ne sont plus possibles. La seule solution compatible avec Python3 à laquelle je pense pour l'instant est l'utilisation de globals
:
def calc4(self, x) :
# Automatically copy every class variable in globals
globals().update(self.__dict__)
sqrt, exp, pi = np.sqrt, np.exp, np.pi
return ( A/( w*sqrt(pi) )/(1+s*w**2/2)
* exp( -(x-x0)**2/w**2 )
* (1+s*(x-x0)**2) + y0 )
Ce qui, encore une fois, serait une pratique terrible en général.
6 votes
Je viens d'un milieu Java et je trouve cela naturel, mais j'ajoute explicitement "this" à chaque appel pour qu'il soit plus clair que je me réfère à une variable d'instance.
4 votes
Connaissez-vous la convention d'un
m_
pour tous les noms de membres, observé par certains programmeurs C++/Java ? L'utilisation deself.
contribue de la même manière à la lisibilité. Vous devriez également lire dirtsimple.org/2004/12/python-n'est-pas-java.html .2 votes
Bien que généralement
m_
est utilisé uniquement pour les membres de données non statiques non publics (du moins en C++).0 votes
@Beni grand article lié, et oui en effet, je suis effectivement la convention de l'utilisation de
mVariableName
pour les variables membres, lorsque l'on code en Java. Je pense que le commentaire de @Anurag résume assez bien ce qu'un développeur Java devrait faire lorsqu'il apprend Python.0 votes
Vous voudrez peut-être jeter un coup d'œil à stackoverflow.com/questions/910020/
13 votes
Alors, comment se fait-il que tout le monde dise au PO pourquoi l'utilisation du self est bonne/nécessaire/etc. mais que personne ne dise si oui ou non on peut l'éviter d'une manière ou d'une autre ? Même si c'est par une sorte de mauvais tour ?
0 votes
Aussi, @Anurag : Comment este de s'accepter un jour ?
0 votes
@Uri mais en tant que programmeurs, ne sommes-nous pas censés être déraisonnablement paresseux ? Mon éditeur de texte peut ajouter tout ce texte self.x plus rapidement :P