0

我创建了一个里面有很多 numpy 数组的类。我创建了一个__getitem__函数,它试图返回索引数组的类,如下所示:

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

和:

def __getitem__(self, indices):
    g = MyClass()
    g.__dict__ = self.__dict__
    for key,value in g.__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

nowMyClass.array1是一个浮点值,显然不是我想要的。

我希望这足够清楚,任何帮助将不胜感激。

我发现了这个,但我不太确定这是否适用于我的问题。

4

1 回答 1

1

这似乎是一个非常糟糕的主意,但它似乎也是一个有趣的问题,所以这是我的破解:

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]
于 2013-09-12T16:28:26.727 回答