2011-10-30 38 views
30

Tôi muốn tạo một lớp mới hoạt động như một loại vùng chứa đặc biệt cho các đối tượng và có thể được truy cập bằng dấu ngoặc vuông.Tạo đối tượng python có thể được truy cập bằng dấu ngoặc vuông

Ví dụ: giả sử tôi có một lớp được gọi là ListWrapper. Giả sử objListWrapper. Khi tôi nói obj[0], tôi mong đợi phương thức obj.access() được gọi với 0 làm đối số. Sau đó, tôi có thể trả lại bất cứ điều gì tôi muốn. Điều này có thể không?

Trả lời

45

Bạn muốn xác định phương thức đặc biệt __getitem__[docs].

class Test(object):  
    def __getitem__(self, arg): 
     return str(arg)*3 

test = Test() 

print test[0] 
print test['kitten'] 

Kết quả:

 
000 
kittenkittenkitten 
+0

Câu trả lời hay nhất: trên điểm, bao gồm liên kết doc và ví dụ đơn giản. –

+0

Cảm ơn! Tôi biết rằng có một số phương pháp mà tôi cần phải xác định để có được chức năng này, tôi chỉ không chắc chắn tên của phương pháp đó là gì. – Ord

+0

Ummmm ... không nên "ví dụ đơn giản", bao gồm 'return some_expression'? –

7

đối tượng chuẩn của Python có một loạt các phương pháp đặt tên __something__ mà chủ yếu sử dụng để cho phép bạn tạo các đối tượng mà móc vào một API trong ngôn ngữ. Ví dụ: __getitem____setitem__ là các phương thức được gọi để nhận hoặc đặt giá trị với ký hiệu []. Có một ví dụ về cách tạo thứ gì đó giống như một phân lớp của từ điển Python tại đây: https://github.com/wavetossed/mcdict

Lưu ý rằng nó không thực sự phân lớp từ điển và cũng có phương pháp update. Cả hai điều này là cần thiết nếu bạn muốn lớp của bạn giả mạo đúng như một từ điển Python.

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