1

来自 h5py 的 HDF 数据集实现了 numpy 数组功能的子集,但具有只有您实际访问的数据才会被读入内存的优点。因此,我想尽可能长时间地使用数据集,并且仅在需要它们缺少的某些功能时才将它们转换为数组。为此,我尝试定义一个包装类,它最初包含一个数据集并将所有内容转发给该类,但它会捕获名称错误并将其数据集转换为数组。我目前的实现是:

class DArr:
    def __init__(self, dset):
        self.arr = dset
    def __getitem__(self, args):
        try:
            return self.arr.__getitem__(args)
        except:
            self.arr = np.array(self.arr)
            return self.arr.__getitem__(args)
    def __getattr__(self, name):
        try:
            return self.arr.__getattr__(name)
        except:
            self.arr = np.array(self.arr)
            return self.arr.__getattr__(name)

self.arr但是,当已成为时,这会失败numpy.array,因为这些显然没有__getattr__我可以转发的。进行这种转发的正确方法是什么?目标是从用户的角度来看, a 的DArr行为应该与 a 一样。numpy.array

4

1 回答 1

2

使用getattr内置函数:

def __getattr__(self, name):
    try:
        return getattr(self.arr, name)
    except:
        self.arr = np.array(self.arr)
        return getattr(self.arr, name)

使用索引运算符__getitem__[]

def __getitem__(self, args):
    try:
        return self.arr[args]
    except:
        self.arr = np.array(self.arr)
        return self.arr[args]
于 2012-11-22T18:40:20.650 回答