0

我有一个对象,它在一个 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 ,因为我觉得这个问题泛化到对象之外的情况。)

这篇关于重载赋值运算符的帖子可能与我想要的很接近: 如何在 Python 中模拟赋值运算符重载?

解决方案:编写获取字段名称__getattr____setattr__在 self.data 上执行必要操作的方法。当提供的字段名称与数据以外的另一个属性的字段名称匹配时,这些将不会被调用,并在提供这些特殊属性的名称时添加从数据中获取内容的功能。

4

2 回答 2

1

如果你的所有领域都有描述性标签,你可以做类似枚举的事情。Python 没有枚举,但有很多方法可以做类似的事情,如下所述:如何在 Python 中表示“枚举”?

例如,冒着通常的枚举辩论的风险,您可以执行以下操作:

def enum(**enums):
    return type('Enum', (), enums)

Numbers = enum(ONE=1, TWO=2, THREE='three')
print Numbers.ONE
print Numbers.TWO
print Numbers.THREE
于 2013-01-14T20:51:17.577 回答
1

您发布的第一种方法对我来说似乎很干净且足够清晰。请记住,

value = data[0]

data[0] = value

只是语法糖

value = data.__getitem__(0)

data.__setitem__(0, value)

分别。

如果您真的非常想让行访问更加清晰,请考虑为不同的字段名称定义常量。

FIELDNAME1, FIELDNAME2, FIELDNAME3 = range(3)

data[FIELDNAME1] = value

value = data[FIELDNAME2]
于 2013-01-14T19:25:05.347 回答