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

时间:2015-04-23 10:13:49

标签: python inheritance recursion

我的目标是使用内置numpy.array从头开始编写类似于list的对象。

我首先创建一个继承Array

的类list

我卡在初始化上。如果我只想处理1维数组,则无需执行任何操作,我保留__init__ __list__方法。问题来自更高的维度。

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__函数范围之外没有任何影响)。

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

1 个答案:

答案 0 :(得分: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)

您可能希望扩展它以支持通用迭代,而不仅仅是列表。