<p>以前的答案基本上都是“你不能”或“你不应该”的变体。虽然我同意后一种观点,但从技术上讲,这个问题仍然没有答案。</p>
<p>此外,有正当的理由可以解释为什么有些人会想按照实际问题的思路去做一些事情。我有时遇到的一件事是冗长的数学公式,其中使用长名称会使公式无法识别。在一个封闭的示例中,有两种方法可以做到这一点:</p>
<pre><code>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))
</code></pre>
<p>第三个例子——即使用<code>for k in self.__dict__ : exec(k+'= self.'+k)</code>基本上就是问题真正想要的,但是让我明确一点,我认为这不是一个好主意。</p>
<p>有关更多信息以及遍历类变量甚至函数的方法,请参见<a href="https://stackoverflow.com/questions/11637293/iterate-over-object-attributes-in-python">this question</a>的解答和讨论。有关动态命名变量的其他方法的讨论,以及为什么这通常不是一个好主意,请参见<a href="http://stupidpythonideas.blogspot.com/2013/05/why-you-dont-want-to-dynamically-create.html" rel="noreferrer">this blog post</a>。</p>