python - 在 python 中转发属性查找

标签 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

最佳答案

使用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]

关于python - 在 python 中转发属性查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13518237/

相关文章:

Python3 'ascii' 编解码器无法对位置 135-136 中的字符进行编码 : ordinal not in range(128)

python PIL : best scaling method that preserves lines

python - 意外的 numpy.unique 行为

python - NumPy ndarray 的绘制方式与等效列表不同?

python - 根据指定属性分组

python - Numpy Where 有两个以上的条件

python - PDA (允许的约会年龄) 算法?

python - Tkinter 按钮使用网格扩展

python - 使用 numpy 快速更新矩阵

python - 如何使用 pandas/numpy/python 数学库计算平均绝对误差 (MAE) 和平均有符号误差 (MSE)?