2012-10-17 14 views
14

Mam problem z listą w klasie w python. Oto mój kod:Python: instancja nie ma atrybutu

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

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

Coś takiego. Otrzymuję powiedzenie o błędzie:

AttributeError: Residues instance has no attribute 'atoms' 
+7

wcięcia swoją prawidłowo kod. –

+1

Na marginesie, jeśli używasz Pythona w wersji 2.x, powinieneś dziedziczyć swoją klasę z "obiektu" lub być naprawdę trudnym do wykrycia niewłaściwych zachowań w przyszłości. – jsbueno

+1

@jsbueno: Wątpię w to. Klasa w starym stylu istnieje od dawna, jak sama nazwa wskazuje, i jakoś ludziom udało się rozgryźć "złe zachowanie". – martineau

Odpowiedz

25

Twoja klasa nie posiada __init__(), więc do czasu to instancja, atrybut atoms nie jest obecny. Trzeba by było zrobić C.setdata('something'), aby stała się dostępna C.atoms.

>>> 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 
>>> 

W przeciwieństwie do języków takich jak Java, gdzie wiesz, w czasie kompilacji jakie atrybuty zmiennych/członek przedmiotem będą miały w Pythonie można dynamicznie dodać atrybuty w czasie wykonywania. Oznacza to również, że instancje tej samej klasy mogą mieć różne atrybuty.

Aby zapewnić zawsze będziesz miał (chyba, że ​​bałagan z nim w dół linia, to twoja własna wina) lista atoms można dodać Konstruktor:

def __init__(self): 
    self.atoms = [] 
+0

+1. OP może również dodać metodę 'def __init __ (self): self.residues = []' jeśli chce, żeby 'atomy' były ustawione nawet zanim' setdata' jest nazywane –

+0

Było bardzo pomocne, teraz rozumiem, bardzo dziękuję –

+1

Nazwałem moją funkcję '__init() _' brakujący ostatni _ ... dziękuję – Goot

Powiązane problemy