如何递归初始化一个继承列表的类?
问题描述:
我的目标是使用内建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,不只是列出。
谢谢,它运作良好。我照你所说的做了:我用'hasattr(x,'__iter __')'替换了'isinstance(x,list)'。 –