我有一个对象,其中包含许多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执行必要的操作。当提供的字段名称与除数据之外的其他属性的字段名称匹配时,将不会调用这些名称,并在提供这些特殊属性的名称时添加从数据中获取内容的功能。
答案 0 :(得分: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]
答案 1 :(得分:1)
如果你有所有领域的描述性标签,你可以做一个类似枚举的事情。 Python没有枚举,但有许多方法可以做类似的事情,如下所述:How can I represent an 'Enum' in 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