2012-11-22 53 views
1

來自h5py的HDF數據集實現了numpy數組的功能的一個子集,但其優點是隻有您實際訪問的數據纔會被讀入內存。因此,我希望儘可能使用數據集,並且只在需要某些功能時纔將它們轉換爲數組。爲此,我試圖定義一個包裝類,它最初包含一個數據集並將所有內容都轉發給它,但是當發生這種情況時會捕獲名稱錯誤並將其轉換爲數組。我目前的實現是:在python中轉發屬性查找

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一樣。

回答

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] 
+0

謝謝,這是我需要的:) – amaurea