在书籍清单中搜寻编号

时间:2019-03-20 21:14:43

标签: python oop

我已经制作了一个简单的图书馆系统,可以存储带有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()

3 个答案:

答案 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