-1
votes

L'objet 'MyList' ne prend pas en charge l'attribution d'éléments

Chers, j'essaie de mieux comprendre le paradigme de la POO en Python, j'ai donc créé cette classe simple

list1[0]=5

Jusqu'à ce que tout va bien, le problème se produit lorsque j'essaie de définir une valeur pour n'importe quel élément de ma liste. Comme exemple:

class MyList:
    def __init__(self,list):
        self.list=list

list1=MyList([1,2,3,4,5])

Ensuite, j'ai eu cette TypeError: l'objet 'MyList' ne prend pas en charge l'attribution d'éléments

Quelqu'un pourrait m'aider avec ça?


6 commentaires

list1.list[0]=5 Vous devez accéder à l'attribut list car list1 n'est pas une list , c'est une instance MyList .


Vous voudrez peut-être implémenter des "méthodes magiques" comme __getitem__ et __setitem__ .


Voir Émulation des types de conteneurs


Est-ce que cela répond à votre question? Accès au nom d'une liste en définissant une nouvelle classe, erreur: l'instance NamedList n'a pas d'attribut '__len__'


Est-ce que cela répond à votre question? Implémentation __setitem__ en Python pour la classe Point (x, y)


Pourquoi vous attendez-vous à ce que MyList en charge l'attribution d'articles? Le code affiché ne définit aucune opération de ce type.


5 Réponses :


1
votes

Vous n'avez aucun code dans la classe qui permet l'attribution d'éléments. Pour qu'un objet autorise l'attribution d'éléments, il doit implémenter __setitem__ .

Vous auriez besoin de quelque chose comme:

class MyList:
    def __init__(self,list):
        self.list=list

    def __setitem__(self, i, elem):
        self.list[i] = elem


3 commentaires

Salut Carcigenicate, merci pour votre soutien. J'ai déjà essayé cela mais j'obtiens ce même message d'erreur ...


@blhsing je l'ai fait, mais pour une raison quelconque, j'avais des recherches dans ma tête pendant que j'écrivais la seconde moitié. Je ne sais pas pourquoi. Fixé.


@ViniciusMiki J'ai eu la mauvaise méthode. Je l'ai écrit en écoutant une conférence et évidemment mon cerveau a été distrait. Essayez le code corrigé.



0
votes
class MyList:
    def __init__(self,list):
        self.list=list
    def __str__(self):
        return str(self.__dict__)

list1=MyList([1,2,3,4,5])
print(list1)

list1.list[0]=5
print(list1)
You need to assign to the list attribute not to the class

0 commentaires

0
votes

Puisque vous essayez de mieux comprendre la POO, voici quelque chose que vous pouvez essayer: La list sous-classes elle-même, afin que votre classe obtienne toutes les propriétés que les list font.

class MyList(list):
    def __init__(self,list):
        super().__init__(list)

list1 = MyList([1,2,3,4,5])
list1[0] = 5

print(list1)
# [5, 2, 3, 4, 5]


0 commentaires

0
votes

Vous essayez probablement de créer un nouveau type MyList qui devrait avoir les fonctionnalités d'une liste Python normale ainsi que certaines fonctionnalités que vous aimeriez ajouter ou modifier. Pour que cela fonctionne, vous devez hériter de la classe de list Python intégrée, comme ceci,

class MyList(list):
    pass

list1=MyList([1,2,3,4,5])

list1[0]=5

Maintenant, dans votre classe MyList , définissez uniquement les méthodes que vous souhaitez modifier dans la classe de list intégrée


0 commentaires

0
votes

J? ai compris! J'ai implémenté la méthode spéciale setitem et getitem et cela a fonctionné. Merci à tous

class MyList:
    def __init__(self,list):
        self.list=list

    def __getitem__(self, index):
        return self.list[index]
    
    def __setitem__(self, index, value):
        self.list[index] = value


0 commentaires