【发布时间】:2013-01-14 18:38:00
【问题描述】:
我有一个对象,它在一个 numpy 数组中包含许多它的字段(它们都是 float64 类型)。其中一些字段具有我想在访问/写入时使用的有意义的名称,但以我目前的知识,我必须像这样访问和编写:
//access:
value = data[0]
//write:
data[0] = value
如果我在 C 中工作,我会这样做:
#define fieldname data[0]
//access:
value = fieldname
//write:
fieldname = value
如何在 python 中做同样干净的事情?
编辑: 所有这些字段都必须保留在 numpy 数组中,因为它们通过使用 numpy 矩阵运算的线性变换进行更新。
编辑: 如果我写这个方法:
def fieldname(self):
return self.data[0]
我的访问看起来像预期的那样,但我无法以相同的方式写回数据。
//access:
value = self.fieldname
(在此之前的代码中省略了self,因为我觉得这个问题泛化到了对象之外的情况。)
这篇关于重载赋值运算符的帖子可能接近我想要的: How to Emulate Assignment Operator Overloading in Python?
解决方案:
编写__getattr__ 和__setattr__ 方法,获取字段名称并对self.data 进行必要的操作。当提供的字段名称与数据以外的另一个属性的字段名称匹配时,这些将不会被调用,并在提供这些特殊属性的名称时添加从数据中获取内容的功能。
【问题讨论】:
-
没有足够的上下文来判断这是否适合您,但请查看 NamedTuple 类:docs.python.org/2/library/…
-
这不完全一样,因为 Python 使用引用,在这种情况下指向不可变对象。如果
data[0]的值改变了value的值不会改变。它将是第一次引用时的任何内容。
标签: python arrays macros rename