setitem和getitem——python
我已经创建了一个python程序,可以生成一个向量。现在,我想使用函数setitem和getitem——python,python,class,Python,Class,我已经创建了一个python程序,可以生成一个向量。现在,我想使用函数\uuuu setitem\uuuuu和\uuu getitem\uuuuu设置一个项。例如,如果vector=Vec()和vector[3]=26会将空向量更改为[0,0,0,26]。我需要覆盖\uuuu getitem\uuuuuuuuu和\uuuuu setitem\uuuuuuuuuuuu我在下面列出了代码,但是我在get和set函数方面遇到了问题。有什么建议吗 class Vec: def __init__(
\uuuu setitem\uuuuu
和\uuu getitem\uuuuu
设置一个项。例如,如果vector=Vec()
和vector[3]=26
会将空向量更改为[0,0,0,26]
。我需要覆盖\uuuu getitem\uuuuuuuuu
和\uuuuu setitem\uuuuuuuuuuuu
我在下面列出了代码,但是我在get和set函数方面遇到了问题。有什么建议吗
class Vec:
def __init__(self, length = 0):
self.vector = [0]*length
def __str__(self):
return '[{}]'.format(', '.join(str(i) for i in self.vector))
#This formats the output according to the homework.
#Adds '[' and ']' and commas between each 0
def __len__(self):
return len(self.vector)
def extend(self, newLen):
self.vector.append([0]*newLen)
return (', '.join(str(j) for j in self.vector))
def __setitem__(self, key, item):
self.vector[key] = item
def __getitem__(self, key):
return self.vector[key]
您需要调整
\uuuu getitem\uuuuuuu
和\uuuuuu setitem\uuuuuuuuu
以委托给基础列表:
def __setitem__(self, key, item):
self.vector[key] = item
# return doesn't make sense here
def __getitem__(self, key):
# not sure what self.__key is ? Let's return value from index in `self.vector` instead
return self.vector[key]
您有几个问题:
extend
实质上是将一个新向量附加到原始向量的末尾,而不是增加原始向量的长度。不清楚它是否需要返回修改向量的字符串表示形式(除非只是为了调试目的)
\uuuuu setitem\uuuu
如果键太大,则需要调用extend
def __setitem__(self, key, item):
if key >= len(self):
self.vector.extend(key+1)
self.vector[key] = item
\uuuu getitem\uuuu
需要访问基础列表,而不是使用未定义的属性
def __getitem__(self, key):
# It's probably better to catch any IndexError to at least provide
# a class-specific exception
return self.vector[key]
问题是您创建的向量没有长度,因为在
\uuuu init\uuuu()
方法定义中给定了length
关键字参数的默认值。试试这个:
vector = Vec(4)
vector[3] = 26
print vector # --> [0, 0, 0, 26]
如果您这样做,那么在
\uuuuu str\uuuuuuuu
中会更容易
return str(self.vector)
你到底遇到了什么麻烦?我无法像我认为的那样更改向量中的键和项。你看到什么了吗?@user3014014我想这是一个学习练习,你不能只继承
list
,如中所示?未来提示:如图所示,str.join
使用列表理解比使用生成器表达式运行得更好。请解释得比“我不能”更好,查看完整的示例和堆栈跟踪非常有用,例如:>>>v=Vec()>>>v[3]=26回溯(最近一次调用):v[3]=26文件“C:\Users\S\Desktop\test.py”中的文件“”,第1行,setitem self.vector[key]中的第18行=项目索引器:列表分配索引超出范围>>>
return str(self.vector)