我试图制作一个2D数组类,并遇到了问题。我能想到的最好的方法是将get / setitem传递给索引的元组,并将其解压缩到函数中。不幸的是,实现看起来非常混乱:
class DDArray:
data = [9,8,7,6,5,4,3,2,1,0]
def __getitem__ (self, index):
return (self.data [index [0]], self.data [index [1]])
def __setitem__ (self, index, value):
self.data [index [0]] = value
self.data [index [1]] = value
test = DDArray ()
print (test [(1,2)])
test [(1, 2)] = 120
print (test [1, 2])
我尝试让它接受更多参数:
class DDArray:
data = [9,8,7,6,5,4,3,2,1,0]
def __getitem__ (self, index1, index2):
return (self.data [index1], self.data [index2])
def __setitem__ (self, index1, index2, value):
self.data [index1] = value
self.data [index2] = value
test = DDArray ()
print (test [1, 2])
test [1, 2] = 120
print (test [1, 2])
但是这会导致一个奇怪的类型错误,告诉我我没有传递足够的参数(我猜下标操作符内部的任何内容都被认为是1个参数,即使有逗号)。
(是的,我知道,上面的课程实际上并不是一个2D数组。我想在我开始实际制作2D之前让操作员弄明白。)
是否有一种标准的方法可以让它看起来更干净一点? 感谢
答案 0 :(得分:1)
有几种方法可以做到这一点。如果你想要test[1][2]
之类的语法,那么你可以让__getitem__
返回一个列(或行),可以用__getitem__
再次索引(或者甚至只返回一个列表)。
但是,如果你想要语法test[1,2]
,那么你走在正确的轨道上,test[1,2]
实际上将元组(1,2)
传递给__getitem__
函数,所以你不要在调用它时需要包括parantheses。
您可以使__getitem__
和__setitem__
实施方式不那么混乱:
def __getitem__(self, indices):
i, j = indices
return (self.data[i], self.data[j])
当然,您实际执行__getitem__
。关键是您已将索引元组拆分为适当命名的变量。