Python - 串行重新分配/更新类成员的正确方法

时间:2013-09-02 14:40:53

标签: python numpy

我有一个类,其成员是通过累积实验数据的值构建的数字列表,如

 class MyClass:
     def __init__(self):
          container1 = []
          container2 = []
            ...

     def accumulate_from_dataset(self,dataset):
          for entry in dataset:
               container1.append( foo (entry) )
               container2.append( bar (entry) )
                  ...


     def process_accumulated_data(self):   
           '''called when all the data is gathered
           '''
           process1(container1)
           process2(container2)
             ...

问题:如果我可以将所有列表转换为numpy数组,那将是有益的。


我尝试了什么:简单的转化

    self.container1 = np.array(self.container1)

的工作原理。虽然,如果我想考虑“一次拍摄更多场地”,比如

     lists_to_convert = [self.container1, self.container2, ...]

     def converter(lists_to_convert):
          for list in lists_to_convert:
               list = np.array(list)

由于对类成员的引用是按值传递的,因此没有任何有效的更改。


我想知道是否有一种智能方法/解决方法来处理整个转换过程。

任何帮助表示赞赏

2 个答案:

答案 0 :(得分:2)

来自The Pragmatic Programmer

  

问问自己:"是否必须这样做?是否必须完成?

也许您应该重新考虑您的数据结构?也许某些字典或简单的列表列表会更容易处理?

请注意,在提供的示例中,container1container2只是初始dataset的转换。它看起来像列表理解的好地方:

foo_data = [foo(d) for d in dataset]
# or even
foo_data = map(foo, dataset)
# or generator version
foo_data_iter = (foo(d) for d in dataset)

如果确实想要按照示例操作实例变量,请查看getattrhasattr内置函数

答案 1 :(得分:1)

没有一种简单的方法可以做到这一点因为你说python传递“by-reference-by-value”

您可以在班级中添加to_numpy方法:

class MyClass:
    def __init__(self):
        container1 = []
        container2 = []
        ...
def to_numpy(self,container):
    list = self.__getattr__(container)
    self.__setattr__(container,np.array(list))
        ...  

然后执行以下操作:

object = MyClass()

lists_to_convert = ["container1", "container2" ...]

def converter(lists_to_convert):
    for list in lists_to_convert:
        object.to_numpy(list)

但它不是很漂亮,这种代码通常会让我退后一步思考我的设计。