2012-10-17 32 views
14

Python'da bir sınıf içerisinde listeyle ilgili bir sorunum var. İşte benim kodum:Python: örneğinin bir özelliği yok

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

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

Böyle bir şey. Bu örneği oluyor zaman, nitelik atoms mevcut olmadığı böylece

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

girinti kodunuzu:

her zaman bir atoms listesi (onunla sen karışıklık aşağı çizgi, o zaman var kendi hatam sürece) bir kurucu ekleyebilirsiniz gerekecek sağlamak. –

+1

Bir yan notta, eğer Python 2.x kullanıyorsan, sınıfını "nesneden" mi almalısın yoksa gelecekte yanlış davranışları anlamak gerçekten zor olacak. – jsbueno

+1

@jsbueno: Bundan kesinlikle şüpheliyim. Eski stil sınıfı, ismin de belirttiği gibi uzun bir süredir etrafta dolaşıyordu ve bir şekilde insanlar “yanlış davranışlarını” iyi bir şekilde anlamaya başlamışlardı. – martineau

cevap

25

Sınıfınız bir __init__() yok: Bir hata diyerek olsun. C.setdata('something') yapmalısınız, böylece C.atoms kullanılabilir hale gelir. Eğer çalışma zamanında dinamik olarak özelliklerini ekleyebilir Python bir nesne olacak/üye değişkenleri, hangi özellikleri derleme sırasında biliyorum Java gibi dillerde farklı olarak

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

. Bu aynı sınıfın örneklerinin farklı özniteliklere sahip olabileceğini ima eder. Düzgün

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

+1. OP, 'def __init __ (self): self.residues = []' metodunu da ekleyebilir. 'Atomların' setdata 'den önce ayarlanmasını istiyorsa –

+0

Çok yardımcı oldu, şimdi anlıyorum, çok teşekkürler –

+1

'__init() _ 'sonuncu eksikimi' işlevimi seçtim ... teşekkür ederim – Goot

İlgili konular