2016-08-31 3 views
1

У меня есть очень простой класс Library, и я инициализирую его переданным в словаре (имя ключевой книги (строка), местоположение полки книги значений (int)) со значениями, уже введенными в Это. Код выглядит следующим образом:Python - Словарь в классе не функционирует должным образом

class Library(object): 
    def __init__(self, book_table): 
     self.book_table = book_table 

    def get_location(self, book_name): 
     if book_name in self.book_table: # ERROR RIGHT HERE 
      return self.book_table[book_name] 
     else: 
      return "Book Not Found" 

libraries = [] 
libraries.append(Library({"Book1":2, "Book2":9})) 
print Library(libraries[0]).get_location("Book1") 

По некоторым причинам, я не могу получить доступ к данным из словаря от метода get_location, но я могу получить доступ к словарю данных в методе инициализации (и я уже тестировал представляют метод, и он работал там тоже). Это ошибка, я получаю:

Traceback (most recent call last): 
    File "C:/Users/Owner/Documents/Programming/PyCharm/Book_Locator/Book_Locator.py", line 13, in <module> 
    print Library(libraries[0]).get_location("Book1") 
    File "C:/Users/Owner/Documents/Programming/PyCharm/Book_Locator/Book_Locator.py", line 6, in get_location 
    book_name in self.book_table: 
TypeError: argument of type 'Library' is not iterable 

Я ожидал, что это распечатать место BOOK1, которая является 2.

+1

Если процесс создания примера показывает, что проблема была, пожалуйста, нам любезно редактировать свой ответ, чтобы объяснить , –

+2

Я не могу опубликовать ответ, пока вопрос все еще находится на удержании, но ваша последняя строка должна быть 'print libraries [0] .get_location (« Book1 »)'. В противном случае вы создаете новую библиотеку, передавая старую библиотеку в качестве 'book_table' dict. – FamousJameous

+0

Спасибо! Я думал, что я «конвертирую» его в тип библиотеки, чтобы получить доступ к методам класса библиотеки, но я думаю, вам не нужно это делать. Как только этот вопрос уйдет, опубликуйте ответ, и я приму его. – itman1234

ответ

1

Вы создаете новыйLibrary экземпляр, который вы передаете существующий экземпляр в:

print Library(libraries[0]).get_location("Book1") 
#  ^^^^^^^ ^^^^^^^^^^^^ 
#  |  \----------- an existing instance of Library 
# A new instance of Library 

Это дает вам Library() случая, когда book_table является другогоLibrary() экземпляра , а не словарь!

Вы хотели бы назвать get_location()непосредственно на libraries[0]:

print libraries[0].get_location("Book1") 

Вы также можете просто хранить толькоbook_table словаря в списке:

libraries = [{"Book1": 2, "Book2": 9}] 
print Library(libraries[0]).get_location("Book1") 

, но это будет только если вам не удалось сохранить Library экземпляров в списке по любой причине.

0

Library(libraries[0]) вы звоните INIT снова

Этот код должен работает

class Library(object): 
    def __init__(self, book_table): 
     self.book_table = book_table 

    def get_location(self, book_name): 
     if book_name in self.book_table: # ERROR RIGHT HERE 
      return self.book_table[book_name] 
     else: 
      return "Book Not Found" 


libraries = [] 
libraries.append(Library({"Book1": 2, "Book2": 9})) 

print libraries[0].get_location("Book1") 
Смежные вопросы