我已经制作了一个简单的图书馆系统,可以存储带有ID,名称和费用的图书。我的问题很简单,但是我对python的有限了解使我失望了。
我已经创建了一个将图书存储在图书馆中的类,它们是按以下方式创建的;
if __name__ == '__main__':
lib = Library()
book1 = Book(1, 'Bookname1', "$30")
book2 = Book(2, 'Bookname2', "$10")
book3 = Book(3, 'Bookname3', "$40")
我必须通过在库类中创建一个函数来通过ID来搜索一本书。我试图使它像下面的代码一样,但是没有用。基本上,我想给我的函数一个ID,并且它应该返回该特定书的名称和成本,但前提是该ID存在于列表中。
class Book:
def __init__(self, ID, name, price):
self.ID = ID
self.name = name
self.price = price
def show(self):
print(self.ID, self.name, self.price)
def get_attribute_string(self):
print(str(self.ID) + '_' + str(self.name) + '_' + str(self.price))
def get_id(self):
print(self.ID)
def get_name(self):
print(self.name)
def get_price(self):
print(self.price)
class Library:
def __init__(self):
self.books = []
def add_book(self, Book):
self.books.append(Book)
def remove_book(self, Book):
self.books.remove(Book)
#def show_id(self, ID):
# if ID in lib:
# return self.books
def show_all(self):
for Book in self.books:
Book.show()
if __name__ == '__main__':
lib = Library()
book1 = Book(1, 'Bookname1', "$30")
book2 = Book(2, 'Bookname2', "$10")
book3 = Book(3, 'Bookname3', "$40")
#1.show_id
lib.add_book(book1)
lib.add_book(book2)
lib.add_book(book3)
lib.remove_book(book2)
lib.show_all()
答案 0 :(得分:2)
我认为,如果您需要ID
索引,最简单的想法是使用dictionary:
class Library:
def __init__(self):
self.books = dict()
def add_book(self, Book):
self.books[Book.ID] = Book
def remove_book(self, Book):
del self.books[Book.ID]
def get_book(self, ID):
return self.books[ID]
def show_id(self, ID):
self.get_book(ID).show()
def show_all(self):
for Book in self.books.values():
Book.show()
您甚至可以将get_book
重命名为__getitem__
,第二个名字在python中是特殊的,它被称为dunder方法(或magic方法)。实现它可以让您编写lib[id]
而不是lib.show_id(id)
(我并不是说您应该这样做,但这是一个选择)。您可以尝试使用许多其他的dunder方法,这些方法可以在python data model中找到。
我认为您应该将代码发布在codereview上,因为您可能会对代码使用更广泛的建议。
答案 1 :(得分:0)
如上所述,可能会有更好的实现,但是使用您当前的代码,您可以在下面的操作中根据需要对show_id
函数进行调整。它依靠list comprehension来标识正确的ID。
希望这会有所帮助!
class Book:
def __init__(self, ID, name, price):
self.ID = ID
self.name = name
self.price = price
def show(self):
print(self.ID, self.name, self.price)
def get_attribute_string(self):
print(str(self.ID) + '_' + str(self.name) + '_' + str(self.price))
def get_id(self):
print(self.ID)
def get_name(self):
print(self.name)
def get_price(self):
print(self.price)
class Library:
def __init__(self):
self.books = []
def add_book(self, Book):
self.books.append(Book)
def remove_book(self, Book):
self.books.remove(Book)
def show_id(self, ID):
# simple list comprehension to filter; note that you might need to make sure that e.g. all IDs are int, or str
matching_ids = [book for book in self.books if book.ID == ID]
# return name, price tuple for all matching books as requested -- note that this will return a list of all matches
# if the IDs are truly unique, you can return e.g. a single tuple or Book object here
# if nothing found, will return empty list
return [(book.name, book.price) for book in matching_ids]
def show_all(self):
for Book in self.books:
Book.show()
if __name__ == '__main__':
lib = Library()
book1 = Book(1, 'Bookname1', "$30")
book2 = Book(2, 'Bookname2', "$10")
book3 = Book(3, 'Bookname3', "$40")
#1.show_id
lib.add_book(book1)
lib.add_book(book2)
lib.add_book(book3)
lib.remove_book(book2)
lib.show_all()
print(lib.show_id(1))
答案 2 :(得分:-1)
即使未真正优化此方法,也可以使用for循环遍历它们。
for book in lib.books:
if book.id == searched_id:
searched_book = book
break