以前的答案基本上都是“你不能”或“你不应该”的变体。虽然我同意后者的观点,但问题在技术上仍未得到回答。
此外,有合法的理由使某人想要做类似于实际问题所问的事情。我有时会遇到冗长的数学方程式,使用长名称会使方程式难以识别。以下是如何在一个简单的示例中做到这一点的几种方法:
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
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 )
def calc2(self, x) :
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 )
def calc3(self, x) :
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))
第三个例子——即使用
for k in self.__dict__ : exec(k+'= self.'+k)
——基本上就是问题实际上所要求的,但请让我明确一点,我认为这通常不是一个好主意。
有关更多信息以及迭代类变量甚至函数的方法,请参见
此问题的答案和讨论。有关其他动态命名变量的方法以及为什么通常不是一个好主意的讨论,请参见
此博客文章。
更新:似乎没有
办法在Python3中动态更新或更改函数中的局部变量,因此calc3和类似变体不再可行。我现在能想到的唯一兼容Python3的解决方案是使用
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 )
再次强调,这通常是一个可怕的做法。
m_
仅用于非公共的非静态数据成员(至少在 C++ 中)。 - Roger Pate