【问题标题】:setitem and getitem -- pythonsetitem 和 getitem -- python
【发布时间】:2013-12-03 16:24:20
【问题描述】:

我创建了一个生成向量的 python 程序。现在我想使用函数__setitem____getitem__ 设置一个项目。例如,如果vector = Vec()andvector[3] = 26 会将空向量更改为[0, 0, 0, 26]。我需要覆盖__getitem____setitem__ 我已经列出了下面的代码,但是我在获取和设置函数时遇到了问题。有什么建议吗?

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]

【问题讨论】:

  • 你到底遇到了什么麻烦?
  • 我无法更改向量中的键和项目,因为我认为我应该能够。你看到什么了吗?
  • @user3014014 我认为这是一个学习练习,你不能只从list 继承,如your other question 所示?
  • 未来提示:如here 所示,str.join 使用列表解析比使用生成器表达式运行得更好。
  • 请解释得比“不能”更好,看看一个完整的例子和堆栈跟踪会非常有用,例如:>>> v = Vec() >>> v[3] = 26 Traceback(最近一次调用最后):文件“”,第 1 行,在 v[3] = 26 文件“C:\Users\S\Desktop\test.py”,第 18 行, in setitem self.vector[key] = item IndexError: list assignment index out of range >>>

标签: python class


【解决方案1】:

你有几个问题:

  1. extend 本质上是在原始向量的末尾附加一个新向量,而不是增加原始向量的长度。不清楚它是否需要返回修改后向量的字符串表示形式(除非它只是为了调试目的)。

    def extend(self, newlength):
        # Assume newlength is greater than the old
        self.vector.extend([0] * (newlength - len(self)))
    
  2. __setitem__如果key过大需要调用extend

    def __setitem__(self, key, item):
        if key >= len(self):
            self.vector.extend(key+1)
        self.vector[key] = item
    
  3. __getitem__需要访问底层列表,不要使用未定义的属性

    def __getitem__(self, key):
        # It's probably better to catch any IndexError to at least provide
        # a class-specific exception
        return self.vector[key]
    

【讨论】:

    【解决方案2】:

    问题是您创建的向量没有长度,因为在__init__() 方法定义中给出了length 关键字参数的默认值。试试这个:

    vector = Vec(4)
    vector[3] = 26
    print vector  # --> [0, 0, 0, 26]
    

    【讨论】:

      【解决方案3】:

      如果你这样做,__str__ 会更容易

      return str(self.vector)
      

      【讨论】:

        【解决方案4】:

        您需要调整您的 __getitem____setitem__ 以委托给基础列表:

        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]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-17
          • 2019-01-12
          • 1970-01-01
          • 2023-02-14
          • 1970-01-01
          • 2018-08-02
          相关资源
          最近更新 更多