setitem和getitem - python

use*_*014 19 python class

我创建了一个创建矢量的python程序.现在,我想设置使用功能的项目__setitem____getitem__.因此,例如,if vector = Vec()vector[3] = 26将更改空向量[0, 0, 0, 26].我需要覆盖__getitem__并且__setitem__我已经列出了下面的代码,但是我遇到了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]
Run Code Online (Sandbox Code Playgroud)

che*_*ner 9

你有几个问题:

  1. extend基本上将一个新的向量附加到原始的末尾,而不是增加原始的长度.目前尚不清楚它是否需要返回修改后的矢量的字符串表示(除非它仅用于调试目的).

    def extend(self, newlength):
        # Assume newlength is greater than the old
        self.vector.extend([0] * (newlength - len(self)))
    
    Run Code Online (Sandbox Code Playgroud)
  2. __setitem__extend如果密钥太大,则需要调用.

    def __setitem__(self, key, item):
        if key >= len(self):
            self.vector.extend(key+1)
        self.vector[key] = item
    
    Run Code Online (Sandbox Code Playgroud)
  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]
    
    Run Code Online (Sandbox Code Playgroud)


mar*_*eau 6

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

vector = Vec(4)
vector[3] = 26
print vector  # --> [0, 0, 0, 26]
Run Code Online (Sandbox Code Playgroud)


Jon*_*nts 1

您需要调整您的__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]
Run Code Online (Sandbox Code Playgroud)