web-dev-qa-db-fra.com

Python: l'instance n'a pas d'attribut

J'ai un problème avec list dans une classe en python. Voici mon code:

class Residues:
    def setdata(self, name):
        self.name = name
        self.atoms = list()

a = atom
C = Residues()
C.atoms.append(a)

Quelque chose comme ça. Je reçois une erreur disant:

AttributeError: Residues instance has no attribute 'atoms'
18
Mantas Marcinkus

Votre classe n'a pas de __init__(), donc au moment où elle est instanciée, l'attribut atoms n'est pas présent. Vous devez faire C.setdata('something') so C.atoms devient disponible.

>>> C = Residues()
>>> C.atoms.append('thing')

Traceback (most recent call last):
  File "<pyshell#84>", line 1, in <module>
    B.atoms.append('thing')
AttributeError: Residues instance has no attribute 'atoms'

>>> C.setdata('something')
>>> C.atoms.append('thing')   # now it works
>>> 

Contrairement à des langages comme Java, où vous savez au moment de la compilation quels attributs/variables membres un objet aura, dans Python vous pouvez ajouter dynamiquement des attributs au moment de l'exécution. Cela implique également que des instances de la même classe peuvent ont des attributs différents.

Pour vous assurer que vous aurez toujours (à moins que vous ne le gâchiez sur toute la ligne, c'est votre faute) une liste atoms, vous pouvez ajouter un constructeur:

def __init__(self):
    self.atoms = []
29
NullUserException