web-dev-qa-db-de.com

setitem und Getitem - Python

Ich habe ein Python-Programm erstellt, das einen Vektor erzeugt. Jetzt möchte ich ein Element mit einer Funktion__setitem__ und__getitem__ einstellen. Ifvector = Vec()andvector[3] = 26 würde zum Beispiel einen leeren Vektor in[0, 0, 0, 26] ändern. Ich muss den __getitem__und__setitem__ überschreiben Ich habe den Code unten aufgelistet, aber ich habe Probleme mit den Funktionen get und set Irgendein Rat?

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]
18
user3014014

Sie haben mehrere Probleme:

  1. extend hängt im Wesentlichen einen neuen Vektor an das Ende des Originals an, anstatt das Original zu verlängern. Es ist nicht klar, dass eine Zeichenfolgendarstellung des geänderten Vektors zurückgegeben werden muss (es sei denn, dies ist nur zu Debugging-Zwecken).

    def extend(self, newlength):
        # Assume newlength is greater than the old
        self.vector.extend([0] * (newlength - len(self)))
    
  2. __setitem__ muss extend aufrufen, wenn der Schlüssel zu groß ist.

    def __setitem__(self, key, item):
        if key >= len(self):
            self.vector.extend(key+1)
        self.vector[key] = item
    
  3. __getitem__ muss auf die zugrunde liegende Liste zugreifen und kein undefiniertes Attribut verwenden

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

Das Problem ist, dass der von Ihnen erstellte Vektor aufgrund des Standardwerts, der das Argument length in der __init__()-Methodendefinition enthält, keine Länge hat. Versuche dies:

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

Sie müssen Ihren __getitem__ und __setitem__ anpassen, um an die zugrunde liegende Liste delegieren zu können:

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]
1
Jon Clements

In __str__ wäre dies einfacher, wenn Sie dies tun

return str(self.vector)
0
Superior