Python类中的数组引用
我创建了一个类,里面有很多numpy数组。我创建了一个Python类中的数组引用,python,arrays,class,magic-methods,Python,Arrays,Class,Magic Methods,我创建了一个类,里面有很多numpy数组。我创建了一个\uuuu getitem\uuuu函数,该函数尝试返回具有如下索引的数组的类: MyClass[i].array1相当于MyClass.array1[i] 我希望getitem返回引用,但它们返回的是副本,所以赋值不起作用 print(MyClass[i].array1) 返回0 MyClass[i].array1 = 10 print(MyClass[i].array1) 仍然返回0 这是我正在使用的_get_item_代码: de
\uuuu getitem\uuuu
函数,该函数尝试返回具有如下索引的数组的类:
MyClass[i].array1
相当于MyClass.array1[i]
我希望getitem返回引用,但它们返回的是副本,所以赋值不起作用
print(MyClass[i].array1)
返回0
MyClass[i].array1 = 10
print(MyClass[i].array1)
仍然返回0
这是我正在使用的_get_item_代码:
def __getitem__(self, indices):
g = copy.copy(self) # should be a shallow copy?
for key,value in g.__dict__.iteritems():
g.__dict__[key] = value[indices]
return g
我也试过:
def __getitem__(self, indices):
g = MyClass()
for key,value in self.__dict__.iteritems():
g.__dict__[key] = value[indices]
return g
以及:
注意,最后一个实例似乎确实返回了引用,但不是我想要的方式。如果我使用最后一段代码为类编制索引,它将对原始类中的数组执行索引和截断,因此:
g=MyClass[i]。array1
截断并覆盖MyClass中的原始数组,使其仅包含索引i的元素,如下所示:
print(len(MyClass.array1))
返回128
print(MyClass[0].array1)
返回0
MyClass[i].array1 = 10
print(MyClass[i].array1)
现在MyClass.array1
是一个单浮点值,显然不是我想要的
我希望这是足够清楚的,任何帮助将不胜感激
我发现了,但我不太确定这是否适用于我的问题。这似乎是一个非常糟糕的主意,但它似乎也是一个有趣的问题,所以这里是我的破解方法:
class MyProxy(object):
def __init__(self, obj, key):
super(MyProxy, self).__setattr__('obj', obj)
super(MyProxy, self).__setattr__('key', key)
def __getattr__(self, name):
return getattr(self.obj, name).__getitem__(self.key)
def __setattr__(self, name, value):
return getattr(self.obj, name).__setitem__(self.key, value)
class MyClass(object):
def __init__(self, array_length):
self.array_length = array_length
def __getitem__(self, key):
if key >= self.array_length:
raise IndexError
return MyProxy(self, key)
例如:
>>> obj = MyClass(4) # replace 4 with the length of your arrays
>>> obj.array1 = [1, 2, 3, 4]
>>> obj.array2 = [5, 6, 7, 8]
>>> for c in obj:
... print c.array1, c.array2
...
1 5
2 6
3 7
4 8
>>> obj[1].array1
2
>>> obj[1].array1 = 5
>>> obj.array1
[1, 5, 3, 4]
它们实际上返回引用-只是给变量赋值会重新绑定引用,而不是跟随引用并处理它引用的对象。你可以写一些描述词来回避这个问题,但我首先要问的是,这是否是个好主意。这似乎大部分是可行的,虽然在MyClass中迭代c时遇到问题:c.array1=0错误:标记输入时发生意外错误,但以下回溯可能已损坏或无效错误消息为:('EOF in multi line string',(33,8))-->180返回getattr(self.obj,name)。\uu setitem__(self.key,value)索引器错误:索引128超出了大小为128的轴0的范围。所有numpy数组的长度是否都相同?如果不是,迭代将很棘手,我想它可能基于最长的numpy数组,但这似乎有点奇怪。是的,它们的第一维都具有相同的长度,尽管有些会有额外的第二或第三维基本上,它们是时间序列数据和信息,其中时间记录是第一个索引。它现在可以用于迭代,您只需要在创建实例时传递数组的长度。这可能会起作用,但我会根据init期间读取的数据设置长度变量,而不是显式传递它。然而,一个问题是,索引类实际上并没有返回类对象,因此没有附加任何方法。我们可以通过使用代理对原始类进行子类化来解决这个问题,比如:类MyProxy(MyClass)?