이전 답변은 모두 기본적으로 "사용할 수 없음"또는 "사용할 수 없음"의 변형입니다. 나는 후자의 감정에 동의하지만, 기술적으로 여전히 대답하지 않습니다.
게다가, 누군가가 실제 질문이하는 것에 따라 누군가 무언가를하고 싶어 할만한 합당한 이유가 있습니다. 내가 때때로 겪는 한 가지는 긴 이름을 사용하면 방정식을 인식 할 수없는 긴 수학 방정식입니다. 미리 준비된 예에서이를 수행 할 수있는 몇 가지 방법은 다음과 같습니다.
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))
세 번째 예, 즉 사용 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 )
다시 말하지만, 일반적으로 끔찍한 관행입니다.