setitem和getitem——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__(

我已经创建了一个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__(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)