python中的转发属性查找

python中的转发属性查找,python,numpy,Python,Numpy,h5py的HDF数据集实现了numpy阵列功能的一个子集,但其优点是只有您实际访问的数据才会读入内存。因此,我希望尽可能长时间地使用数据集,并且只在需要它们缺少的某些功能时将它们转换为数组。为此,我尝试定义一个包装类,它最初包含一个数据集并将所有内容转发给该数据集,但它会捕获名称错误,并在发生这种情况时将其数据集转换为数组。我目前的做法是: class DArr: def __init__(self, dset): self.arr = dset def __ge

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
时,这会失败,因为这些数组显然没有
\uuu getattr\uuu
我可以转发到的。做这种转发的正确方法是什么?目标是从用户的角度来看,
DArr
应该像
numpy.array
一样工作。

使用
getattr
内置函数:

def __getattr__(self, name):
    try:
        return getattr(self.arr, name)
    except:
        self.arr = np.array(self.arr)
        return getattr(self.arr, name)
对于
\uu getitem\uu
使用
[]
索引运算符:

def __getitem__(self, args):
    try:
        return self.arr[args]
    except:
        self.arr = np.array(self.arr)
        return self.arr[args]

谢谢,这正是我需要的:)