2015-06-11 7 views
5

Это может быть очень простой вопрос, но я очень смущен тем, куда я сейчас иду. Вот очень простой класс:Объект не имеет атрибута '__getitem__' (класс экземпляра?)

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

И когда я запускаю это:

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

Он выплевывает:

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

Я знаю, что это не обычный способ инициализации экземпляра потому что я использую словарь. Но мне интересно, почему этот код выплевывает TypeError. Как мне решить эту проблему? Спасибо заранее.

пс. Тип экземпляра книги является классом?

ответ

11

Это потому, что класс не является объектом dict. Доступ к свойствам экземпляра класса выполняется через оператор точки.

book.book['price'] 
>> 300 

Если вы хотите получить доступ к разделам в вашем Словаре непосредственно на вашем экземпляре класса вы должны реализовать __getitem__ метод на классе.

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

book['price'] 
>> 300 
5

Да. книга - объект класса Книга, потому что вы ее инициализировали таким образом.

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

Попробуйте

print book.book['price']

Так что вы хотите получить доступ словаря под названием книга объекта ссылочный, как книги, и вы хотите, чтобы извлечь значение цен из словаря ,

Обычно оператор [] ищет метод __getitem__() и передает запрошенный ключ в качестве аргумента. Лукас Р. показал, как это сделать. Словари выполняют ключевой поиск, в то время как массивы находят срез или индекс.

Это объясняется подробно здесь: https://docs.python.org/2/reference/datamodel.html

Теперь, поскольку вы создаете класс здесь, почему вы хотите создать отдельный словарь для нативного нужно обязательно иметь атрибуты класса. Создайте такие атрибуты, как в следующем примере:

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'] будет работать. Для доступа к члену прокси-сервера вам нужно будет реализовать метод магии __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'] 
Смежные вопросы