练习三—类的应用 - 图2
练习三—类的应用 - 图3
练习三—类的应用 - 图4

程序的骨架

练习三—类的应用 - 图5定义Book类

  1. class Book:
  2. def __init__(self, name, author, comment, state = 0):
  3. self.name = name
  4. self.author = author
  5. self.comment = comment
  6. self.state = state
  7. # 分别表示书名、作者、推荐语和借阅状态
  8. book = Book('看不见的城市','卡尔维诺','献给城市的最后一首爱情诗')
  9. # state为默认参数,如无修改必要不用传递
  10. print(book.author)

为了后续方便参数传递,借阅状态state采用默认参数,用0来表示’未借出’,1来表示’已借出’。
初始化方法定义完成后,一旦实例对象被创建,这几个属性就存在且可随时调用。

名称:《像自由一样美丽》 作者:林达 推荐语:你要用光明来定义黑暗,用黑暗来定义光明。
状态:未借出

  1. class Book:
  2. def __init__(self, name, author, comment, state = 0):
  3. self.name = name
  4. self.author = author
  5. self.comment = comment
  6. self.state = state
  7. def show_info(self):
  8. if self.state == 0:
  9. # 如果属性state等于0
  10. status = '未借出'
  11. # 将字符串'未借出'赋值给status
  12. else:
  13. status = '已借出'
  14. return '名称:《%s》 作者:%s 推荐语:%s 状态:%s ' % (self.name, self.author, self.comment, status)
  15. # 返回书籍信息

Bingo!不过这里老师要介绍一个更符合编程习惯的方法__str__(self)
在Python中,如果方法名形式是左右带双下划线的,那么就属于特殊方法(如初始化方法),有着特殊的功能。
解释一下:只要在类中定义了__str__(self)方法,那么当使用print打印实例对象的时候,就会直接打印出在这个方法中return的数据。
可能有点绕,看代码会直观一点。我们直接把上述代码里的方法名show_info(self)替换成__str__(self),留意最后一行调用的代码,然后点击运行:

  1. class Book:
  2. def __init__(self, name, author, comment, state = 0):
  3. self.name = name
  4. self.author = author
  5. self.comment = comment
  6. self.state = state
  7. def __str__(self):
  8. if self.state == 0:
  9. status = '未借出'
  10. else:
  11. status = '已借出'
  12. return '名称:《%s》 作者:%s 推荐语:%s\n状态:%s ' % (self.name, self.author, self.comment, status)
  13. book1 = Book('像自由一样美丽','林达','你要用光明来定义黑暗,用黑暗来定义光明')
  14. # 传入参数,创建实例对象
  15. print(book1)
  16. # 直接打印对象即可,不能写成print(book1.__str__())

类BookManager的编写

练习三—类的应用 - 图6menu()是与用户互动的界面,刚刚我们已经给出了demo:
练习三—类的应用 - 图7

用户输入数字执行相应的功能,程序内部调用的逻辑应该是:
1.查询所有书籍
# 调用方法show_all_book()

2.添加书籍
# 调用方法add_book()

3.借阅书籍
# 调用方法lend_book()

4.归还书籍
# 调用方法return_book()

5.退出系统

请输入数字选择对应的功能:

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