2012-08-31 82 views
1

我遇到了一個對象的初始化問題,以及覆蓋我不想覆蓋的數據的方法。self __init__覆蓋

我很抱歉,如果我的術語不正確,因爲我使用多種編碼語言進行工作,並且往往會在來回跳動時忘記某些術語。

實施例:

class SR(object): 
     def __init__(self,arg1): 

      ...some code with arg1... 

      ...import some stuff into a,b,c,d,e... 

      self.A = array([a,b,c,d,e)] 

      print self.A 

      self.B = self.func1(self.A) 

      print self.A 
      print self.B 

     def func1(self,arg2): 

      arg2[:,:] += ...some math... 
      arg2[:,:] *= ...more math... 

      arg3 = ...total of some stuff in arg2... 

      return arg3 

     def func2(self,arg4): 
      ...use func3... 
      ...use func1... 
      return arg5 

     def func3(self,arg4): 
      return arg6 

     def func4(self,arg7): 
      ...output some stuff...     

instance = SR(2012) 

data = {...numbers...} 
X = instance.func2(data) 
instance.func4('label1') 

data = {...numbers...} 
X = instance.func2(data) 
instance.func4('label2') 

data = {...numbers...} 
X = instance.func2(data) 
instance.func4('label3') 

data = {...numbers...} 
X = instance.func2(data) 
instance.func4('label4') 

data = {...numbers...} 
X = instance.func2(data) 
instance.func4('label5') 

打印:

[a,b,c,d,e] 
[a,not_b,not_c,d,not_e] 
[sum-of-a-not_b-not_c-d-not_e] 

問題:

印刷應該像第一行中的第二行。我希望能夠改變self.A中的值,但我不想永久改變它們。我認爲func1只會收到一個引用或指向self.A,但它似乎是over-writing self.A.

我該如何解決這個問題?請記住,我需要使用func1來永久更改每個實例中的數據,但不是self.A.

回答

0

如果你不想改變self.A,那麼當你調用FUNC1你應該通過:

self.func1(list(self.A)) 
+0

如果我的列表沒有整數索引會怎麼樣?他們是元組。 –

0

的問題是,你func1方法修改其參數到位:

def func1(self,arg2): 
     arg2[:,:] += ...some math... 
     arg2[:,:] *= ...more math... 

您可能有一個很好的理由這樣做,但它可能會有一些意想不到的副作用,正如您所經歷的那樣。您有兩種選擇,那麼:

  • 修改func1以便您不要修改參數。例如:

    def func1(self, arg2): 
        arg2_copy = arg2.copy() 
        arg2_copy[:,:] += .... 
    
  • 傳遞參數的副本func1

    self.B = self.func1(self.A.copy()) 
    

我用了一個.copy方法,因爲我認爲self.Andarray。如果不是這種情況,你將不得不使用適當的技巧(如製作另一個列表或另一個字典......)