如何递归初始化一个继承列表的类?

问题描述:

我的目标是使用内建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__函数范围之外的任何影响)。

我的问题是如何实现我的目标?

这似乎工作:

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)'。 –