以前の回答はすべて基本的に「できない」または「すべきでない」の変形です。私は後者の意見に同意しますが、問題は技術的にまだ答えられていません。
さらに、実際の質問が尋ねていることに沿って誰かが何かをしたいと思う正当な理由があります。私が時々遭遇することの1つは、長い名前を使用すると式が認識できなくなる長い数学の方程式です。缶詰の例でこれを行う方法のいくつかの方法を次に示します。
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))
3番目の例-つまり、使用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 )
これもまた、一般的にはひどい習慣です。