2015-08-04 16 views
12

Tôi có một lớp học như thế này:đối tượng 'MyClass' không có thuộc tính '__getitem__'

class MyClass(object): 
    def __init__(self, id, a, b, c): 
     self.myList  = [] 
     self.id   = id 
     self.a   = a 
     self.b   = b 
     self.c   = c 

    def addData(self, data): 
     self.myList.append(data) 

Trong mã chính của tôi, tôi có thể tạo một danh sách các trường hợp MyClass gọi myClassList. Trong một dòng, tôi phải kiểm tra xem một mục với một số id đã cho đã tồn tại chưa. Tôi làm điều đó theo cách này:

id = 'foo' # in real code is set dynamically 
recent_item = next((item for item in myClassList if item['id'] == id), None) 

dòng thứ hai trong mã tăng lỗi này:

'MyClass' object has no attribute '__getitem__'

Làm thế nào tôi có thể sửa chữa?

+1

Bạn cần thêm '__getitem__' –

+1

... bạn có thể triển khai' __getitem__'! Ngoài ra, sử dụng 'item.id' thay vì' item ['id'] '. Cũng lưu ý rằng bạn đang chỉ định 'self.id = a', có thể không phải là ý của bạn và không tuân thủ [hướng dẫn kiểu] (http://www.python.org/dev/peps/pep) -0008 /). – jonrsharpe

Trả lời

18

item không phải là từ điển nhưng là lớp nên có cú pháp khác nhau để truy cập thành viên. Truy cập id cách này thay vì:

item.id 
1

Giống như lỗi gợi ý, bạn chỉ có thể sử dụng subscript trên trường lớp, nếu lớp định nghĩa một phương pháp __getitem__() dụ.

id là thuộc tính của cá thể, bạn nên sử dụng - item.id thay vì item['id'].

Ví dụ -

recent_item = next((item for item in myClassList if item.id == id), None) 
2

id là một thuộc tính của MyClass Ví dụ, bạn phải truy cập vào nó như item.id

recent_item = next((item for item in myClassList if item.id == id), None) 
+1

Đó là một thuộc tính * *, thuộc tính * * có gì đó khác. – jonrsharpe

+1

@jonrsharpe sửa – Anbarasan

+0

Xin lỗi để đánh bại một bụi cây chết, nhưng tôi nghĩ rằng nó sẽ là chính xác để gọi nó là một tài sản trong trường hợp này? https://stackoverflow.com/a/7374831/6743506 –

6

Nếu bạn thực sự muốn để có thể truy cập vào thuộc tính của bạn sử dụng inst["attr"] và giải thích lỗi của bạn, bạn sẽ cần phải thêm một số __getitem__ vào lớp học của bạn:

class MyClass(object): 
    def __init__(self, id, a, b, c): 
     self.myList  = [] 
     self.id   = id 
     self.a   = a 
     self.b   = b 
     self.c   = c 

    def addData(self, data): 
     self.myList.append(data) 

    def __getitem__(self, item): 
     return getattr(self, item) 
+1

Tôi nghĩ rằng đây phải là câu trả lời được chấp nhận, cung cấp một công việc xung quanh quá. –

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