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

yyouがPython 2.xを使用している場合は、「オブジェクト」からクラスを継承するか、将来の不正行為を把握するのが本当に難しくなります。 – jsbueno

+1

@jsbueno:私はそれを強く疑う。古いスタイルのクラスは、その名前が意味するように、長い間、長い間存在しており、何らかの形で、人々は自分たちの "誤った動き"を把握しています。 – martineau

答えて

25

それがインスタンス化の時代で、属性atomsが存在しないので、あなたのクラスは、__init__()を持っていない:私はというエラーを取得します。あなたは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 
>>> 

Pythonであなたが実行時に動的に属性を追加することができ、オブジェクトが持つことになります/メンバ変数をどの属性コンパイル時にあなたが知っているJavaの、のような言語とは異なり。これはまた、同じクラスのインスタンスが異なる属性を持つことができることを意味します。あなたが常にありますようにするには

(それにあなたが混乱ダウンラインをしない限り、それはあなた自身のせいです)あなたは、コンストラクタを追加することができatomsリスト:

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

+1。 OPは、 'set __data'が呼び出される前に' atoms'を設定したい場合は、 'def __init __(self):self.residues = []'メソッドを追加することもできます –

+0

非常に役に立ちました、ありがとう、ありがとう、 –

+1

私は私の関数 '__init()_'に最後の_が足りなかったという名前を付けました...ありがとう – Goot

関連する問題