web-dev-qa-db-fra.com

setitem et getitem - python

J'ai créé un programme python qui crée un vecteur. Maintenant, je veux définir un élément en utilisant une fonction__setitem__ et__getitem__. Ainsi, par exemple, ifvector = Vec()andvector[3] = 26 changerait un vecteur vide en[0, 0, 0, 26]. Je dois remplacer le__getitem__et__setitem__ J'ai répertorié le code ci-dessous, mais j'ai des problèmes avec les fonctions get et set. Aucun conseil?

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

Vous avez plusieurs problèmes:

  1. extend ajoute essentiellement un nouveau vecteur à la fin de l'original, plutôt que d'augmenter la longueur de l'original. Il n'est pas clair qu'il doive renvoyer une représentation sous forme de chaîne du vecteur modifié (sauf si c'est uniquement à des fins de débogage).

    def extend(self, newlength):
        # Assume newlength is greater than the old
        self.vector.extend([0] * (newlength - len(self)))
    
  2. __setitem__ doit appeler extend si la clé est trop grande.

    def __setitem__(self, key, item):
        if key >= len(self):
            self.vector.extend(key+1)
        self.vector[key] = item
    
  3. __getitem__ doit accéder à la liste sous-jacente, ne pas utiliser d'attribut non défini

    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

Le problème est que le vecteur que vous avez créé n'a pas de longueur en raison de la valeur par défaut étant donné l'argument du mot clé length dans la définition de méthode __init__(). Essaye ça:

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

Vous devez adapter vos __getitem__ et __setitem__ à déléguer à la liste sous-jacente:

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

Ce serait plus facile dans __str__ si vous faites cela

return str(self.vector)
0
Superior