2012-10-17 261 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

相關問題