Las respuestas anteriores son básicamente variantes de "no puedes" o "no deberías". Si bien estoy de acuerdo con el último sentimiento, la pregunta técnicamente aún no tiene respuesta.
Además, existen razones legítimas por las cuales alguien podría querer hacer algo similar a lo que se está haciendo la pregunta real. Una cosa con la que me encuentro a veces son las largas ecuaciones matemáticas donde el uso de nombres largos hace que la ecuación sea irreconocible. Aquí hay un par de formas de cómo podría hacer esto en un ejemplo enlatado:
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))
El tercer ejemplo, es decir, usar for k in self.__dict__ : exec(k+'= self.'+k)
es básicamente lo que la pregunta realmente está pidiendo, pero permítanme aclarar que no creo que sea una buena idea.
Para obtener más información y formas de iterar a través de variables de clase, o incluso funciones, vea las respuestas y la discusión de esta pregunta . Para una discusión sobre otras formas de nombrar dinámicamente variables, y por qué esto generalmente no es una buena idea, vea esta publicación de blog .
ACTUALIZACIÓN: Parece que no hay forma de actualizar dinámicamente o cambiar locales en una función en Python3, por lo que calc3 y variantes similares ya no son posibles. La única solución compatible con python3 que se me ocurre ahora es usar 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 )
Lo cual, nuevamente, sería una práctica terrible en general.
m_
prefijo para todos los nombres de miembros observados por algunos programadores de C ++ / Java? El uso deself.
ayuda a la legibilidad de manera similar. Además, debe leer dirtsimple.org/2004/12/python-is-not-java.html .m_
se usa solo para miembros de datos no públicos no estáticos (al menos en C ++).mVariableName
, para las variables miembro, al codificar en Java. Creo que el comentario de @ Anurag lo resume bastante bien, por lo que un desarrollador de Java debe hacer al aprender Python.