4

我在 python 中有一个类,它充当 c 库的前端。该库执行模拟并处理非常大的数据数组。这个库传递一个ctype数组,我的包装器将它转换成一个适当的numpy.ndarray.

class SomeClass(object):
    @property
    def arr(self):
        return numpy.array(self._lib.get_arr())

但是,为了确保不会发生内存问题,我将 ndarray 数据与库数据分开,因此更改 ndarray 不会导致库正在使用的真实数组发生变化。但是,我可以传递一个相同形状的新数组并覆盖库的保存数组。

@arr.setter
def arr(self, new_arr):
    self._lib.set_arr(new_arr.ctypes)

所以,我可以像这样与数组交互:

x = SomeClass()
a = x.arr
a[0] += 1
x.arr = a

我的愿望是通过允许语法更简单地简化这一点x.arr[0] += 1,这将更具可读性并且具有更少的变量。我不确定如何创建这样一个包装器(我几乎没有制作包装器类/函数的经验),它模仿属性但允许项目访问作为我的示例。

我将如何制作这样一个包装类?有没有更好的方法来实现这个目标?如果您有任何可以帮助的建议或阅读材料,我将不胜感激。

4

2 回答 2

4

这可以工作。Array是 Numpy/C 数组的代理:

class Array(object):

    def __init__(self):
        #self.__lib = ...
        self.np_array = numpy.array(self._lib.get_arr())

    def __getitem__(self, key): 
        self.np_array = numpy.array(self._lib.get_arr())
        return self.np_array.__getitem__(key)

    def __setitem__(self, key, value):
        self.np_array.__setitem__(key, value)
        self._lib.set_arr(new_arr.ctypes)

    def __getattr__(self, name):
        """Delegate to NumPy array."""
        try:
            return getattr(self.np_array, name)
        except AttributeError:
            raise AttributeError(
                 "'Array' object has no attribute {}".format(name))

应该像这样:

>>> a = Array()
>>> a[1]
1
>>> a[1] = 10
>>> a[1]
10

也应该在你的10C 数组中结束。

于 2013-06-03T09:28:03.757 回答
0

我认为您的描述符应该返回类似列表的类的实例,该类知道self._lib并将在正常操作期间对其进行更新append__setitem__等等__getitem__

于 2013-06-03T09:00:49.847 回答