2015-04-23 55 views
0

我的目標是使用內建list從頭開始編寫類似於numpy.array的對象。如何遞歸初始化一個繼承列表的類?

我開始創建一個類Array繼承list

我陷入了初始化。如果我只想處理1維陣列,那麼就沒有什麼可做的了,我保留__list__的方法__init__。問題來自更高的維度。

class Array(list): 
    pass # no __init__ method, we keep the method from list 

它這樣做是:

>>> a = Array([[1, 2], [3, 4]]) 
>>> isinstance(a, Array) # expect True 
True 
>>> isinstance(a[0], Array) # expect True 
False 

然後我試過如下:

class Array(list): 

    def __init__(self, l): 
     if l == [] or all(not isinstance(x, list) for x in l): 
      self = l 
     else: 
      assert(all(isinstance(x, list) for x in l)) 
      self = Array(Array(x) for x in l) 

但它不工作:

>>> a = Array([1, 2]) 
>>> a # expect [1, 2] 
[] 

我明白了爲什麼以前的代碼不工作。第一個不在子列表上調用數組初始化方法,第二個在本地覆蓋self(但它不具有__init__函數範圍之外的任何影響)。

我的問題是如何實現我的目標?

回答

2

這似乎工作:

class Array(list): 

    def __init__(self, l): 

     def a(x): 
      if isinstance(x, list): 
       return Array([a(y) for y in x]) 
      return x 

     if isinstance(l, list): 
      self.extend(a(x) for x in l) 
     else: 
      self.append(l) 

z = Array([1,[2,[3]]]) 
assert isinstance(z, Array) 
assert isinstance(z[1], Array) 
assert isinstance(z[1][1], Array) 

您可能要擴大這種支持通用iterables,不只是列出。

+0

謝謝,它運作良好。我照你所說的做了:我用'hasattr(x,'__iter __')'替換了'isinstance(x,list)'。 –