【问题标题】:self __init__ overwrite自我 __init__ 覆盖
【发布时间】:2012-08-26 17:53:05
【问题描述】:

我在初始化对象以及覆盖我不想覆盖的数据的方法方面遇到问题。

如果我的术语不正确,我深表歉意,因为我在工作中使用多种编码语言,并且在来回跳动时往往会忘记一些术语。

例子:

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 中。

【问题讨论】:

    标签: methods initialization python-2.7 self overwrite


    【解决方案1】:

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

    self.func1(list(self.A))
    

    【讨论】:

    • 如果我的列表没有整数索引怎么办?它们是元组。
    【解决方案2】:

    问题是你的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。如果不是这样,您将不得不使用适当的技巧(例如制作另一个列表或另一个字典......)

    【讨论】:

      猜你喜欢
      • 2016-03-20
      • 1970-01-01
      • 2019-04-10
      • 2021-02-22
      • 2016-02-01
      • 2020-06-14
      • 1970-01-01
      • 2020-02-01
      • 2010-10-19
      相关资源
      最近更新 更多