如何递归初始化列表的 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)
您可能希望对其进行扩展以支持通用的可迭代对象,而不仅仅是列表。
我的目标是使用内置 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)
您可能希望对其进行扩展以支持通用的可迭代对象,而不仅仅是列表。