python小项目——图书馆

python小项目3——图书管理系统

项目要求

项目要求

拆解项目,分析过程

  • 用面向对象编程来完成这个程序(类)
  • 要思考:需要定义多少个类?每个类有怎样的属性和方法?

  • 类的两种用法
    • 第一种用法是使用类生成实例对象。类作为实例对象的模版,每个实例创建后,都将拥有类的所有属性和方法。
    • 第二种用法是用类将多个函数(方法)打包封装在一起,让类中的方法相互配合。
类的两种用法

  • 我们的处理对象是每本具体的书,而每本书都有自己的属性信息,所以我们可以定义一个Book类,利用Book类创建一个个书的实例,绑定属性(对应用法1)。
  • 管理系统的运行主体,是多个可供选择的功能的叠加,所以我们可以创建一个系统运行类BookManager,将查询书籍、添加书籍等功能封装成类中的方法以供调用(对应用法2)。
  • 预期效果是当实例化这个系统运行类的时候,会出现一个菜单,能让用户选择不同的功能
预期效果
  • 为了让类的结构更清晰,我们可以将这个选择菜单也封装成一个方法menu(),方便调用其他方法。
  • 将上述要编写的两个类整理一下,这个程序的骨架出现了:(注释里对应每个方法的功能)
程序骨架
  • 后续,我们可以先按这个框架来编写代码,解决编写过程中出现的每一个问题,让目标得实现。

代码实现,逐步执行

定义Book类

  • 每本书的基本属性都要有四个:书名、作家、推荐语和借阅状态。所以,我们可以利用初始化方法init,让实例被创建时自动获得这些属性。
class Book:
    def __init__(self, name, author, comment, state = 0):
        self.name = name
        self.author = author
        self.comment = comment
        self.state = state
      # 分别表示书名、作者、推荐语和借阅状态  

book = Book('看不见的城市','卡尔维诺','献给城市的最后一首爱情诗')
# state为默认参数,如无修改必要不用传递
print(book.author)
  • 为了后续方便参数传递,借阅状态state采用默认参数,用0来表示'未借出',1来表示'已借出'。

  • 系统里有一个功能是显示所有书籍信息,所以我们可以在Book类定义一个方法,当调用这个方法时,就能够打印出这本书的信息,加上循环,就能打印所有书籍的信息。
名称:《像自由一样美丽》 作者:林达 推荐语:你要用光明来定义黑暗,用黑暗来定义光明。
状态:未借出  
class Book:

    def __init__(self, name, author, comment, state = 0):
        self.name = name
        self.author = author
        self.comment = comment
        self.state = state

    def show_info(self):
        if self.state == 0:
        # 如果属性state等于0
            status = '未借出'
            # 将字符串'未借出'赋值给status
        else:
            status = '已借出'
        return '名称:《%s》 作者:%s 推荐语:%s 状态:%s ' % (self.name, self.author, self.comment, status)
        # 返回书籍信息

  • 一个更符合编程习惯的方法str(self)
  • 在Python中,如果方法名形式是左右带双下划线的,那么就属于特殊方法(如初始化方法),有着特殊的功能。
  • 只要在类中定义了str(self)方法,那么当使用print打印实例对象的时候,就会直接打印出在这个方法中return的数据
  • 我们直接把上述代码里的方法名show_info(self)替换成str(self)
class Book:

    def __init__(self, name, author, comment, state = 0):
        self.name = name
        self.author = author
        self.comment = comment
        self.state = state

    def __str__(self):
        if self.state == 0:
            status = '未借出'
        else:
            status = '已借出'
        return '名称:《%s》 作者:%s 推荐语:%s\n状态:%s ' % (self.name, self.author, self.comment, status)

book1 = Book('像自由一样美丽','林达','你要用光明来定义黑暗,用黑暗来定义光明')
# 传入参数,创建实例对象
print(book1)
# 直接打印对象即可,不能写成print(book1.__str__())
  • 打印的结果是一模一样的,区别就是str打印对象即可打印出该方法中的返回值,而无须再调用方法。

  • book类代码整合
class Book:

    def __init__(self, name, author, comment, state = 0):
        self.name = name
        self.author = author
        self.comment = comment
        self.state = state

    def __str__(self):
        if self.state == 0:
            status = '未借出'
        else:
            status = '已借出'
        return '名称:《%s》 作者:%s 推荐语:%s\n状态:%s ' % (self.name, self.author, self.comment, status)

类BookManager的编写

BookManager
  • menu()是与用户互动的界面,用户输入数字执行相应的功能
class BookManager:

    def menu(self):
        print('欢迎使用流浪图书管理系统,每本沉默的好书都是一座流浪的岛屿,希望你有缘发现并着陆,为精神家园找到一片栖息地。\n')
        while True:
            print('1.查询所有书籍\n2.添加书籍\n3.借阅书籍\n4.归还书籍\n5.退出系统\n')
            choice = int(input('请输入数字选择对应的功能:'))
            if choice == 1:
                self.show_all_book()
                # 调用对象方法时self不能忘
            elif choice == 2:
                self.add_book()
            elif choice == 3:
                self.lend_book()
            elif choice == 4:
                self.return_book()
            elif choice == 5:
                print('感谢使用!愿你我成为爱书之人,在茫茫书海里相遇。')
                break

  • show_all_book()方法,它的功能是打印出系统里所有书籍的信息
  • 先往书籍系统里添加几本书籍,也就是创建Book类的实例对象。
class Book:
    def __init__(self, name, author, comment, state = 0):
        self.name = name
        self.author = author
        self.comment = comment
        self.state = state

    def __str__(self):
        if self.state == 0:
            status = '未借出'
        else:
            status = '已借出'
        return '名称:《%s》 作者:%s 推荐语:%s\n状态:%s ' % (self.name, self.author, self.comment, status)

class BookManager:
    def __init__(self):
        book1 = Book('惶然录','费尔南多·佩索阿','一个迷失方向且濒于崩溃的灵魂的自我启示,一首对默默无闻、失败、智慧、困难和沉默的赞美诗。')
        book2 = Book('以箭为翅','简媜','调和空灵文风与禅宗境界,刻画人间之缘起缘灭。像一条柔韧的绳子,情这个字,不知勒痛多少人的心肉。')
        book3 = Book('心是孤独的猎手','卡森·麦卡勒斯','我们渴望倾诉,却从未倾听。女孩、黑人、哑巴、醉鬼、鳏夫的孤独形态各异,却从未退场。', 1)

manager = BookManager()
  • 在BookManager类的初始化方法中创建了3个Book类的实例对象。换言之,当创建实例manager时,book1、book2、book3就会生成。
  • 当有多个对象的时候,就要考虑数据存储的方式。由于每个Book实例是并列平行的关系,所以可以用列表来存储。
  • 可以在类的开头定义一个空列表books,方便其他方法调用,然后把刚刚创建的Book实例添加到这个列表里。
class BookManager:

    books = []
    # 创建一个列表,列表里每个元素都是Book类的一个实例

    def __init__(self):
        book1 = Book('惶然录','费尔南多·佩索阿','一个迷失方向且濒于崩溃的灵魂的自我启示,一首对默默无闻、失败、智慧、困难和沉默的赞美诗。')
        book2 = Book('以箭为翅','简媜','调和空灵文风与禅宗境界,刻画人间之缘起缘灭。像一条柔韧的绳子,情这个字,不知勒痛多少人的心肉。')
        book3 = Book('心是孤独的猎手','卡森·麦卡勒斯','我们渴望倾诉,却从未倾听。女孩、黑人、哑巴、醉鬼、鳏夫的孤独形态各异,却从未退场。', 1)
        # 创建三个实例对象

        self.books.append(book1)
        self.books.append(book2)
        self.books.append(book3)
        # 往列表依次添加元素,注意调用类属性books时,self不能丢
        # self.books = [book1, book2, book3]
        # 上面三行代码,可简化为一行,即直接创建列表。这种情况下,可不用在前面创建空列表。
  • 列表books里的每个元素都是基于Book类创建的实例对象,所以每个元素会自动拥有Book类的方法str
  • 当使用print输出对象的时候,只要自己定义了str(self)方法,那么就会打印从在这个方法中return的数据
# 阅读最后三行代码,直接运行即可
class Book:
 
    def __init__(self, name, author, comment, state = 0):
        self.name = name
        self.author = author
        self.comment = comment
        self.state = state
 
    def __str__(self):
        status = '未借出'
        if self.state == 1:
            status = '已借出'
        return '名称:《%s》 作者:%s 推荐语:%s\n状态:%s ' % (self.name, self.author, self.comment, status)
 
class BookManager:

    books = []
    # 存储书籍的列表,每一个元素都是Book的实例对象
    def __init__(self):
        book1 = Book('惶然录','费尔南多·佩索阿','一个迷失方向且濒于崩溃的灵魂的自我启示,一首对默默无闻、失败、智慧、困难和沉默的赞美诗。')
        book2 = Book('以箭为翅','简媜','调和空灵文风与禅宗境界,刻画人间之缘起缘灭。像一条柔韧的绳子,情这个字,不知勒痛多少人的心肉。')
        book3 = Book('心是孤独的猎手','卡森·麦卡勒斯','我们渴望倾诉,却从未倾听。女孩、黑人、哑巴、醉鬼、鳏夫的孤独形态各异,却从未退场。',1)
        self.books.append(book1)
        self.books.append(book2)
        self.books.append(book3)

manager = BookManager()
print(len(manager.books))
# 打印列表长度
for book in manager.books:
    print(book)
  • book1,book2,book3,都是Book类的实例对象。又因为对象本身有str方法,所以当打印对象时,就会打印出该方法中的返回值。
  • 把上述代码最后几行代码封装成方法。
class BookManager:

    books = []

    def __init__(self):
        book1 = Book('惶然录','费尔南多·佩索阿','一个迷失方向且濒于崩溃的灵魂的自我启示,一首对默默无闻、失败、智慧、困难和沉默的赞美诗。')
        book2 = Book('以箭为翅','简媜','调和空灵文风与禅宗境界,刻画人间之缘起缘灭。像一条柔韧的绳子,情这个字,不知勒痛多少人的心肉。')
        book3 = Book('心是孤独的猎手','卡森·麦卡勒斯','我们渴望倾诉,却从未倾听。女孩、黑人、哑巴、醉鬼、鳏夫的孤独形态各异,却从未退场。',1)
        self.books.append(book1)
        self.books.append(book2)
        self.books.append(book3)

    def menu(self):
        print('欢迎使用流浪图书管理系统,每本沉默的好书都是一座流浪的岛屿,希望你有缘发现并着陆,为精神家园找到一片栖息地。\n')
        while True:
            print('1.查询所有书籍\n2.添加书籍\n3.借出书籍\n4.归还书籍\n5.退出系统\n')
            choice = int(input('请输入数字选择对应的功能:'))
            if choice == 1:
                self.show_all_book()

    def show_all_book(self):
        for book in self.books:
        # self是实例对象的替身
            print(book)

manager = BookManager()
manager.menu()

  • 合并两个类的代码
class Book:
 
    def __init__(self, name, author, comment, state = 0):
        self.name = name
        self.author = author
        self.comment = comment
        self.state = state
 
    def __str__(self):
        status = '未借出'
        if self.state == 1:
            status = '已借出'
        return '名称:《%s》 作者:%s 推荐语:%s\n状态:%s ' % (self.name, self.author, self.comment, status)
 
class BookManager:

    books = []

    def __init__(self):
        book1 = Book('惶然录','费尔南多·佩索阿','一个迷失方向且濒于崩溃的灵魂的自我启示,一首对默默无闻、失败、智慧、困难和沉默的赞美诗。')
        book2 = Book('以箭为翅','简媜','调和空灵文风与禅宗境界,刻画人间之缘起缘灭。像一条柔韧的绳子,情这个字,不知勒痛多少人的心肉。')
        book3 = Book('心是孤独的猎手','卡森·麦卡勒斯','我们渴望倾诉,却从未倾听。女孩、黑人、哑巴、醉鬼、鳏夫的孤独形态各异,却从未退场。',1)
        self.books.append(book1)
        self.books.append(book2)
        self.books.append(book3)

    def menu(self):
        print('欢迎使用流浪图书管理系统,每本沉默的好书都是一座流浪的岛屿,希望你有缘发现并着陆,为精神家园找到一片栖息地。\n')
        while True:
            print('1.查询所有书籍\n2.添加书籍\n3.借出书籍\n4.归还书籍\n5.退出系统\n')
            choice = int(input('请输入数字选择对应的功能:'))
            if choice == 1:
                self.show_all_book()
                break

    def show_all_book(self):
        for book in self.books:
            print(book)
            print('')

manager = BookManager()
manager.menu()

  • 第二个功能:添加书籍add_book()。
  • 当输入数字2的时候,就会跳转到对应的方法:
class Book:   

    def __init__(self, name, author, comment, state = 0):
        self.name = name
        self.author = author
        self.comment = comment
        self.state = state

class BookManager:

    books = [] 

    def add_book(self):
        new_name = input('请输入书籍名称:')
        new_author =  input('请输入作者名称:')
        new_comment = input('请输入书籍推荐语:')
        # 获取书籍相应信息,赋值给属性

        new_book = Book(new_name, new_author, new_comment)
        # 传入参数,创建Book类实例new_book 
        self.books.append(new_book)
        # 将new_book添加到列表books里
        print('书籍录入成功!\n')

manager = BookManager()
manager.add_book()
add_book顺序图

  • 第三个功能:借阅书籍lend_book()。
  • 几种情况:
    • 1.TA压根没这个东西;
    • 2.TA有这个东西,但是被借走了;
    • 3.TA有这个东西,借给我们了;
借阅思路
class BookManager:

    books = []     
    def __init__(self):
        book1 = Book('惶然录','费尔南多·佩索阿','一个迷失方向且濒于崩溃的灵魂的自我启示,一首对默默无闻、失败、智慧、困难和沉默的赞美诗。')
        book2 = Book('以箭为翅','简媜','调和空灵文风与禅宗境界,刻画人间之缘起缘灭。像一条柔韧的绳子,情这个字,不知勒痛多少人的心肉。')
        book3 = Book('心是孤独的猎手','卡森·麦卡勒斯','我们渴望倾诉,却从未倾听。女孩、黑人、哑巴、醉鬼、鳏夫的孤独形态各异,却从未退场。',1)
        self.books.append(book1)
        self.books.append(book2)
        self.books.append(book3)

    def lend_book(self):
        borrow_name = input('请输入你想借阅的书籍名称:')
        for book in self.books:
        # 遍历列表,此时books有三个元素,即book1,book2,book3三个实例
            if book.name == borrow_name:
                # 如果列表中有实例的属性name和输入的书籍名称相等
                if book.state == 1:
                # 借阅状态为'已借出'
                    print('你来晚一步,这本书已经被借走了噢')
                    break
                    # 一旦有对象满足条件,则退出for循环
                else:
                # 借阅状态为'未借出'
                    print('借阅成功!借了不看会变胖噢~')
                    book.state = 1
                    break
            else:
                continue
          # 如果不满足book.name == borrow_name,则继续循环(这两行可以省略)  
        else:
            print('这本书暂时没有收录在系统里呢')
  • 最外层结构是for...else,表示的是当for循环里的对象都遍历完毕后,才执行else子句的内容。
  • 当列表里没有对象能够满足if book.name == borrow_name条件时,才会打印else子句的那一句话。(如果for循环内部有break子句,也不会执行)
  • 归还书籍的时候,也会碰到类似的逻辑。为了不写重复的代码,我们可以额外在类中定义一个方法,专门检查输入的书名是否在书籍列表里。
  • 换句话说:将上面lend_book()方法中检测书名的代码抽出来,封装成一个函数。这样就可以在借书和还书的代码里直接调用,不用两处重复写同样的代码。
class BookManager:

    books = []     

    def check_book(self,name):
        for book in self.books:
            if book.name == name:
                 return book   
        else:
            return None

    def lend_book(self):
        name = input('请输入书籍的名称:')
        res = self.check_book(name)
        # 将name作为参数调用check_book方法,并将返回值赋值给变量res

        if res != None:
        # 如果返回值不等于None值,即返回的是实例对象
            if res.state == 1:
            # 如果实例对象的属性state为1,即借阅状态为已租借
                print('你来晚了一步,这本书已经被借走了噢')
            else:
            # 如果state为0
                print('借阅成功,借了不看会变胖噢~')
                res.state = 1
                # 书籍借出后属性state变为1
        else:
        # 如果返回值为None值
            print('这本书暂时没有收录在系统里呢')

  • 代码整合
class Book:
 
    def __init__(self, name, author, comment, state = 0):
        self.name = name
        self.author = author
        self.comment = comment
        self.state = state
 
    def __str__(self):
        status = '未借出'
        if self.state == 1:
            status = '已借出'
        return '名称:《%s》 作者:%s 推荐语:%s\n状态:%s ' % (self.name, self.author, self.comment, status)
 
class BookManager:
    #存储书籍的列表,每一个元素都是Book的实例对象
    books = []
    def __init__(self):
        book1 = Book('惶然录','费尔南多·佩索阿','一个迷失方向且濒于崩溃的灵魂的自我启示,一首对默默无闻、失败、智慧、困难和沉默的赞美诗。')
        book2 = Book('以箭为翅','简媜','调和空灵文风与禅宗境界,刻画人间之缘起缘灭。像一条柔韧的绳子,情这个字,不知勒痛多少人的心肉。')
        book3 = Book('心是孤独的猎手','卡森·麦卡勒斯','我们渴望倾诉,却从未倾听。女孩、黑人、哑巴、醉鬼、鳏夫的孤独形态各异,却从未退场。',1)
        self.books.append(book1)
        self.books.append(book2)
        self.books.append(book3)
 
    def menu(self):
        print('欢迎使用流浪图书管理系统,每本沉默的好书都是一座流浪的岛屿,希望你有缘发现并着陆,为精神家园找到一片栖息地。\n')
        while True:
            print('1.查询所有书籍\n2.添加书籍\n3.借出书籍\n4.归还书籍\n5.退出系统\n')
            choice = int(input('请输入数字选择对应的功能:'))
            if choice == 1:
                self.show_all_book()
            elif choice == 2:
                self.add_book()
            elif choice == 3:
                self.lend_book()
            elif choice == 4:
                self.return_book()
            elif choice == 5:
                print('感谢使用!')
                break
 
    def show_all_book(self):
        for book in self.books:
            print(book)
            print('')

    def add_book(self):
        new_name = input('请输入书籍名称:')
        new_author =  input('请输入作者名称:')
        new_comment = input('请输入书籍推荐语:')
        new_book = Book(new_name, new_author, new_comment)
        self.books.append(new_book)
        print('书籍录入成功!\n')

    def check_book(self,name):
        for book in self.books:
            if book.name == name:
                 return book 
        else:
            return None

    def lend_book(self):
        name = input('请输入书籍的名称:')
        res = self.check_book(name)

        if res != None:
            if res.state == 1:
                print('你来晚了一步,这本书已经被借走了噢')
            else:
                print('借阅成功,借了不看会变胖噢~')
                res.state = 1
        else:
            print('这本书暂时没有收录在系统里呢')
 
manager = BookManager()
manager.menu()

  • return_book这一功能了,它和lend_book有着异曲同工之妙,也是调用check_book方法进行判断
class Book:
 
    def __init__(self, name, author, comment, state = 0):
        self.name = name
        self.author = author
        self.comment = comment
        self.state = state
 
    def __str__(self):
        status = '未借出'
        if self.state == 1:
            status = '已借出'
        return '名称:《%s》 作者:%s 推荐语:%s\n状态:%s ' % (self.name, self.author, self.comment, status)
 
class BookManager:

    books = []
    def __init__(self):
        book1 = Book('惶然录','费尔南多·佩索阿','一个迷失方向且濒于崩溃的灵魂的自我启示,一首对默默无闻、失败、智慧、困难和沉默的赞美诗。')
        book2 = Book('以箭为翅','简媜','调和空灵文风与禅宗境界,刻画人间之缘起缘灭。像一条柔韧的绳子,情这个字,不知勒痛多少人的心肉。')
        book3 = Book('心是孤独的猎手','卡森·麦卡勒斯','我们渴望倾诉,却从未倾听。女孩、黑人、哑巴、醉鬼、鳏夫的孤独形态各异,却从未退场。',1)
        self.books.append(book1)
        self.books.append(book2)
        self.books.append(book3)
 
    def menu(self):
        print('欢迎使用流浪图书管理系统,每本沉默的好书都是一座流浪的岛屿,希望你有缘发现并着陆,为精神家园找到一片栖息地。\n')
        while True:
            print('1.查询所有书籍\n2.添加书籍\n3.借阅书籍\n4.归还书籍\n5.退出系统\n')
            choice = int(input('请输入数字选择对应的功能:'))
            if choice == 1:
                self.show_all_book()
            elif choice == 2:
                self.add_book()
            elif choice == 3:
                self.lend_book()
            elif choice == 4:
                self.return_book()
            elif choice == 5:
                print('感谢使用!愿你我成为爱书之人,在茫茫书海里相遇。')
                break
 
    def show_all_book(self):
        print('书籍信息如下:')
        for book in self.books:
            print(book)
            print('')

    def add_book(self):
        new_name = input('请输入书籍名称:')
        new_author =  input('请输入作者名称:')
        new_comment = input('请输入书籍推荐语:')
        new_book = Book(new_name, new_author, new_comment)
        self.books.append(new_book)
        print('书籍录入成功!\n')

    def check_book(self,name):
        for book in self.books:
            if book.name == name:
                 return book 
        else:
            return None

    def lend_book(self):
        name = input('请输入书籍的名称:')
        res = self.check_book(name)

        if res != None:
            if res.state == 1:
                print('你来晚了一步,这本书已经被借走了噢')
            else:
                print('借阅成功,借了不看会变胖噢~')
                res.state = 1
        else:
            print('这本书暂时没有收录在系统里呢')
    
    def return_book(self):
        name = input('请输入归还书籍的名称:')
        res = self.check_book(name)
        # 调用check_book方法,将返回值赋值给变量res
        if res == None:
        # 如果返回的是空值,即这本书的书名不在系统里
            print('没有这本书噢,你恐怕输错了书名~')
        else:
        # 如果返回的是实例对象
            if res.state == 0:
             # 如果实例属性state等于0,即这本书的借阅状态为'未借出'
                print('这本书没有被借走,在等待有缘人的垂青呢!')
            else:
             # 如果实例属性state等于1,即状态为'已借出'
                print('归还成功!')
                res.state = 0
                # 归还后书籍借阅状态为0,重置为'未借出'
 
manager = BookManager()
manager.menu()

扩展:书的分类

在Book类的基础上,创建一个子类FictionBook类表示虚构类图书,并改造初始化方法,增加一个默认参数type = '虚构类'。
再利用str()方法打印出FictionBook类实例的相关信息。

class Book:
 
    def __init__(self, name, author, comment, state = 0):
        self.name = name
        self.author = author
        self.comment = comment
        self.state = state
 
# 创建一个Book类的子类 FictionBook

class FictionBook(Book):
    def __init__(self, name, author, comment, state = 0, type = '虚构类'):
        Book.__init__(self, name, author, comment, state = 0)
        self.type = type

    def __str__(self):
        status = '未借出'
        if self.state == 1:
            status = '已借出'
        return '类型:%s 名称:《%s》 作者:%s 推荐语:%s\n状态:%s ' % (self.type, self.name, self.author, self.comment, status)


book = FictionBook('囚鸟','冯内古特','我们都是受困于时代的囚鸟')
print(book)

扩展2

新建一个类的方法show_author_book(),让程序能够根据作者名来展示相关书籍的信息。

class Book:
 
    def __init__(self, name, author, comment, state = 0):
        self.name = name
        self.author = author
        self.comment = comment
        self.state = state
 
    def __str__(self):
        status = '未借出'
        if self.state == 1:
            status = '已借出'
        return '名称:《%s》 作者:%s 推荐语:%s\n状态:%s ' % (self.name, self.author, self.comment, status)
 
class BookManager:

    authors = []
    def __init__(self):
        book1 = Book('撒哈拉的故事','三毛','我每想你一次,天上便落下一粒沙,从此便有了撒哈拉。')
        book2 = Book('梦里花落知多少','三毛','人人都曾拥有荷西,虽然他终会离去。')
        book3 = Book('月亮与六便士','毛姆','满地都是六便士,他却抬头看见了月亮。')
        self.books = [book1,book2,book3]
        self.authors.append(book1.author)
        self.authors.append(book2.author)
        self.authors.append(book3.author)
 
    def menu(self):
        while True:
            print('1.查询书籍')
            choice = int(input('请输入数字选择对应的功能:'))
            if choice == 1:
                self.show_author_book()
            else:
                print('感谢使用!')
                break
 
    def show_author_book(self):
        author = input('请输入想查询作家的名称:')
        if author in self.authors:
            print(author + '的作品有:')
            for book in self.books:
                if book.author == author:
                    print(book)
        else:
            print('很可惜,我们暂时没有收录这位作者的作品')

manager = BookManager()
manager.menu() 
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353