python - 在图书列表中搜索 ID
问题描述
我制作了一个简单的图书馆系统,它存储带有 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()
解决方案
我认为如果您需要ID
索引,最简单的想法是使用字典:
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 方法(或魔法方法)。实施它将允许您编写lib[id]
而不是lib.show_id(id)
(我不是说您应该这样做,但这是一种选择)。您可以尝试使用许多其他 dunder 方法来获得乐趣,您可以在python 数据模型中找到其中的一些。
我认为您应该在codereview上发布您的代码,因为您可能会在代码上使用更广泛的建议。
推荐阅读
- python - 在 nifti 文件中保存具有复杂组件的矢量
- android-gradle-plugin - 哪个 gradle 版本与最新的 Android Studio 3.5 一起使用?
- netlogo - 如何一次选择/询问更多品种?
- angular - 使用 Response -> HttpResponse 将项目从 Angular 5 迁移到 8 问题
- animation - SwiftUI:自定义模态动画
- java - Intellij - 设置 Java 版本的不同位置
- reactjs - 反应最终形式条件表单字段在渲染时未获取值
- symfony - Symfony4:验证 DateIntervalType
- angular - 如何在 VSCode 中的 TypeScript 文件中显示来自 HTML 文件(Angular 模板)的引用?
- reactjs - Apollo 错误链接 - 捕获错误并渲染自定义 React 组件