0
我的目標是使用內建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__
函數範圍之外的任何影響)。
我的問題是如何實現我的目標?
謝謝,它運作良好。我照你所說的做了:我用'hasattr(x,'__iter __')'替換了'isinstance(x,list)'。 –