2012-10-17 28 views
14

Tôi gặp vấn đề với danh sách trong một lớp trong python. Đây là mã của tôi:Python: instance không có thuộc tính

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

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

Điều gì đó tương tự. Tôi nhận được một câu nói lỗi:

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

thụt lề mã của bạn đúng cách. –

+1

Trên một lưu ý phụ, nếu yyou đang sử dụng Python 2.x, bạn nên kế thừa lớp của bạn từ "đối tượng" hoặc có thể thực sự khó khăn để tìm ra hành vi sai trái trong tương lai. – jsbueno

+1

@jsbueno: Tôi thực sự nghi ngờ điều đó. Lớp học kiểu cũ đã tồn tại trong một thời gian dài, như cái tên ngụ ý, và bằng cách nào đó mọi người đã tìm ra được "những hành vi sai trái" của họ tốt. – martineau

Trả lời

25

lớp của bạn không có một __init__(), vì vậy vào thời điểm nó được khởi tạo, thuộc tính atoms là không có mặt. Bạn sẽ phải làm C.setdata('something') để C.atoms khả dụng.

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

Không giống như các ngôn ngữ như Java, tại thời điểm biên dịch thuộc tính/biến thành viên một đối tượng, trong Python bạn có thể thêm thuộc tính động vào thời gian chạy. Điều này cũng ngụ ý rằng các cá thể của cùng một lớp có thể có các thuộc tính khác nhau.

Để đảm bảo bạn sẽ luôn có (trừ khi bạn gây rối với nó xuống dòng, thì đó là lỗi của riêng bạn) một danh sách atoms bạn có thể thêm một constructor:

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

+1. OP cũng có thể thêm phương thức 'def __init __ (self): self.residues = []' nếu anh ta muốn 'nguyên tử' được đặt ngay cả trước' setdata' được gọi là –

+0

Rất hữu ích, tôi hiểu bây giờ, cảm ơn bạn rất nhiều –

+1

Tôi đặt tên hàm của tôi '__init() _' thiếu _ cuối cùng ... cảm ơn bạn – Goot

Các vấn đề liên quan