我的目标是使用内置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__
函数范围之外没有任何影响)。
我的问题是如何实现我的目标?
答案 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)
您可能希望扩展它以支持通用迭代,而不仅仅是列表。