在python中转发属性查找

时间:2012-11-22 18:22:54

标签: python numpy

来自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__。这种转发的正确方法是什么?目标是DArr从用户的角度来看应该像numpy.array一样。

1 个答案:

答案 0 :(得分: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]