自我__init__覆盖

时间:2012-08-31 22:52:05

标签: methods initialization python-2.7 self overwrite

我在初始化对象时遇到问题,而且方法会覆盖我不想覆盖的数据。

如果我的术语不正确,我道歉,因为我使用多种编码语言进行工作,而且在来回弹跳时我倾向于忘记一些术语。

示例:

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的指针,但它似乎是在覆盖self.A。

我该如何解决这个问题?

请记住,我需要使用func1永久更改每个实例中的数据,但不能在self.A中使用。

2 个答案:

答案 0 :(得分:0)

如果您不想更改self.A,那么当您调用func1时,您应该通过:

self.func1(list(self.A))

答案 1 :(得分: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。如果不是这样,你将不得不使用正确的技巧(比如制作另一个列表或其他字典......)