来自 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/