2012-09-19 4 views
0

는 파이썬에서 함수 foo를 만들 수 있습니다 경우 궁금 해서요 그래서인스턴스 변수

def calulate (self, input): 
    input = #some stuff 

def foo2(self): 
    self.calculate(self.var1) 
    self.calculate(self.var2) 

또는이

def calculation(self): 
    output=#some stuff 
    return output 
def foovar1(self): 
    self.var1=self.calculation() 
    self.var2=self.calculation() 

내가 정말하고 싶지 않아 어떻게해야합니까 더 많은 함수를 만드는 것을 의미하기 때문에이 작업을 수행 할 수 있습니다.

+1

당신의 두 가지 변종이 꽤 많은 차이가, 나는 그것을 얻지 않는다. :/ – unwind

+0

나는이 발췌 문장이 원하는 것을 단어로 설명해야한다고 생각한다. – mgilson

+0

@unwind 아니 그들은 그냥 바보 이유에 대한 다른 이름을 사용하지 않습니다 –

답변

2

파이썬에서는 함수 인수를 변경할 수는 있지만 호출자의 범위에서 직접 리 바인드 할 수는 없습니다. self.var1가 변경 가능한 객체가 들어있는 경우,

def foo(self, inputname): 
    setattr(self, inputname, #some stuff) 

def foo2(self): 
    self.foo('var1') 
    self.foo('var2') 

다른 방법 : 당신은 인스턴스 멤버 이름을 전달할 수 목록 당신은 쓸 수 있습니다 : 당신이 아닌 (베어 =을)를 리 바인딩 (전체 슬라이스에 할당) 목록 개체를 돌연변이하고 있기 때문에이 작동

def foo (self, input): 
    input[:] = #some stuff 

def foo2(self): 
    self.foo(self.var1) 
    self.foo(self.var2) 

합니다.

+0

WOW thanks !!! 하지만 궁금해? 왜 입력 [:] = # 일부 물건 작동합니까? –

+1

@WasiqKashkari'input [:] = something'을 쓸 때'input'이라는 이름이 가리키는 객체를 수정하고 있습니다; 'input = something'을 쓸 때'something'을 참조하기 위해'input'이라는 이름을 리 바인딩하는 것입니다. – ecatmur

+0

aaah sweet !!! 포인터를 좀 좋아해. :) –

0

다른 해결책으로는 특수 제작 된 컨테이너가있을 수 있습니다.

class Container(object): 
    def __init__(self, value=None): 
     self.value = value 

다음은 다른 클래스에서 사용 :

def foo(self, container): 
    container.value = ... 

def foo2(self): 
    self.foo(self.var1) 
    self.foo(self.var2)