2012-09-19 204 views
0

我想知道是否有可能在Python創建一個函數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

在Python中,你可以改變函數參數,但你不能直接在調用者的作用域中重新綁定它們。你可以通過實例成員名稱:

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

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

或者,如果self.var1是可變對象如一個列表,你可以寫:

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

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

這工作,因爲你是變異的列表對象(將其分配給全切片),而不是重新綁定它(裸=)。

+0

哇謝謝!!!但只是想知道?爲什麼輸入[:] = #some東西的工作? –

+1

@WasiqKashkari當你寫'input [:] = something'時,你正在修改名爲'input'的對象;當你寫'input = something'時,你只需重新輸入'input'來引用'something'。 – ecatmur

+0

aaah甜美!!!有點像c中的指針:) –

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)