2012-10-17 216 views
14

我有一个python类中的列表有问题。这是我的代码:Python:实例没有属性

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

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

就像这样。我得到一个错误说:

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

缩进你的代码正确。 –

+1

另一方面,如果你使用的是Python 2.x,你应该从“对象”继承你的类,或者在未来很难弄清楚错误行为。 – jsbueno

+1

@jsbueno:我非常怀疑这一点。顾名思义,老式的课程已经存在了很长一段时间,不知何故人们设法弄清楚他们的“不正当行为”就好。 – martineau

回答

25

你的类没有一个__init__(),所以由它的实例化时,该属性atoms不存在。你必须做C.setdata('something')所以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 
>>> 

不同于像Java,你知道在编译时什么属性/成员变量的对象都会有,在Python可以在运行时动态添加属性的语言。这也意味着同一类的实例可以具有不同的属性。

为了确保您始终(除非你惹它的路线,那么这是你自己的错)的atoms列表,你可以添加一个构造函数:

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

+1。如果在'setdata'被调用之前,OP也可以添加'def __init __(self):self.residues = []''方法'' –

+0

非常有帮助,我现在明白了,非常感谢 –

+1

我命名我的函数'__init()_'缺少最后一个_ ...谢谢 – Goot

相关问题