2015-06-11 28 views
5

Nó có thể là một câu hỏi rất đơn giản nhưng tôi rất bối rối với nơi tôi đang đi ngay bây giờ. Dưới đây là một lớp học rất cơ bản:Đối tượng không có thuộc tính '__getitem__' (lớp thể hiện?)

class Book(object): 
    def __init__(self, title, price): 
     self.book = {'title':title, 'price':price} 

Và khi tôi chạy này:

book = Book('foo', 300) 
book['price'] 

Nó spits ra:

TypeError: 'Book' object has no attribute '__getitem__' 

Tôi biết rằng nó không phải là cách thông thường của khởi tạo một thể hiện vì tôi đang sử dụng từ điển. Nhưng tôi tự hỏi tại sao mã đó lại phun ra một TypeError. Làm thế nào để tôi giải quyết vấn đề này? Cảm ơn bạn trước.

ps. Loại dụ của cuốn sách là lớp học?

Trả lời

11

Đó là vì lớp học không phải là đối tượng chính tả. Truy cập các thuộc tính trên một thể hiện của một lớp được thực hiện thông qua toán tử dấu chấm.

book.book['price'] 
>> 300 

Nếu bạn muốn truy cập các phím trong dict của bạn trực tiếp trên dụ lớp của bạn, bạn sẽ phải thực hiện các phương pháp __getitem__ về lớp học của bạn.

def __getitem__(self, key): 
    return self.book[key] 

book['price'] 
>> 300 
5

Có. book là một đối tượng của lớp Book vì bạn đã khởi tạo nó theo cách đó.

book = Book('foo', 300) 
book['price'] 

Hãy thử

print book.book['price']

Vì vậy, bạn muốn truy cập vào một từ điển được gọi là cuốn sách của một đối tượng tham chiếu như cuốn sách và bạn muốn trích xuất các giá trị của giá từ điển .

Thông thường toán tử [] tìm kiếm phương thức __getitem__() và chuyển khóa được yêu cầu làm đối số. Łukasz R. đã chỉ ra cách làm điều đó. Từ điển thực hiện tra cứu chính trong khi các mảng tìm thấy slice hoặc chỉ mục.

Nó được miêu tả chi tiết ở đây: https://docs.python.org/2/reference/datamodel.html

Bây giờ vì bạn đang tạo một lớp ở đây, tại sao bạn muốn tạo một từ điển riêng cho mẹ đẻ phải có các thuộc tính của lớp. Tạo các thuộc tính như ví dụ sau:

class Book(object): 
    def __init__(self, title, price): 
     self.title = 'foo' 
     self.price = 300 

book = Book('foo', 300) 
print book.title 
3

book.book['price'] sẽ hoạt động. Để truy cập thành viên proxy, bạn sẽ phải thực hiện phương thức ma thuật __getitem__.

class Book(object): 
    def __init__(self, title, price): 
     self.book = {'title':title, 'price':price} 
    def __getitem__(self, item): 
     return self.book[item] 
1
class Book(object): 
    def __init__(self, title, price): 
     self.book = {'title':title, 'price':price}    

book = Book('foo', 300) 
print book.book['price'] 
Các vấn đề liên quan