如何递归初始化列表的 class 继承?

How to initialize recursively a class inheriting of list?

我的目标是使用内置 list.

从头开始​​编写类似于 numpy.array 的对象

我首先创建 class Array 继承 list

我在初始化过程中卡住了。如果我只想处理一维数组,没办法,我保留__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)

您可能希望对其进行扩展以支持通用的可迭代对象,而不仅仅是列表。