2012-10-17 50 views
14

Ich habe ein Problem mit der Liste innerhalb einer Klasse in Python. Hier ist mein Code:Python: Instanz hat kein Attribut

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

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

So etwas wie das. Ich erhalte einen Fehler Spruch:

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

indent Code. –

+1

Nebenbei, wenn Sie Python 2.x verwenden, sollten Sie Ihre Klasse von "Objekt" erben oder unterliegen wirklich schwer zu Fehlverhalten in der Zukunft herausfinden. – jsbueno

+1

@jsbueno: Ich bezweifle das stark. Old-Style-Klassen gibt es schon lange, wie der Name schon sagt, und irgendwie haben die Leute es geschafft, ihre "Fehlverhalten" gut zu verstehen. – martineau

Antwort

25

Ihre Klasse hat keine __init__(), so durch die Zeit es instanziiert ist, atoms das Attribut nicht vorhanden ist. Sie müssten C.setdata('something') tun, damit C.atoms verfügbar wird.

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

Anders als in Sprachen wie Java, wo Sie bei der Kompilierung wissen, welche Attribute/Membervariablen ein Objekt hat, in Python Sie dynamisch Attribute zur Laufzeit hinzufügen können. Dies bedeutet auch, dass Instanzen derselben Klasse unterschiedliche Attribute haben können.

Sie immer (die Linie, es sei denn, Sie verwirren mit ihm nach unten, dann Ihre eigene Schuld es ist), um sicherzustellen, werden eine atoms Liste Sie einen Konstruktor könnte hinzufügen: richtig

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

+1. OP können auch die Methode 'def __init __ (self) hinzu: self.residues = []', wenn er will 'atoms' sogar eingestellt werden, bevor' setdata' –

+0

sehr nützlich War genannt wird, ich verstehe jetzt, ich danke Ihnen sehr –

+1

Ich nannte meine Funktion '__init() _' die letzte _ fehlt ... danke – Goot

Verwandte Themen