程序的骨架
定义Book类
class Book:def __init__(self, name, author, comment, state = 0):self.name = nameself.author = authorself.comment = commentself.state = state# 分别表示书名、作者、推荐语和借阅状态book = Book('看不见的城市','卡尔维诺','献给城市的最后一首爱情诗')# state为默认参数,如无修改必要不用传递print(book.author)
为了后续方便参数传递,借阅状态state采用默认参数,用0来表示’未借出’,1来表示’已借出’。
初始化方法定义完成后,一旦实例对象被创建,这几个属性就存在且可随时调用。
名称:《像自由一样美丽》 作者:林达 推荐语:你要用光明来定义黑暗,用黑暗来定义光明。
状态:未借出
class Book:def __init__(self, name, author, comment, state = 0):self.name = nameself.author = authorself.comment = commentself.state = statedef show_info(self):if self.state == 0:# 如果属性state等于0status = '未借出'# 将字符串'未借出'赋值给statuselse:status = '已借出'return '名称:《%s》 作者:%s 推荐语:%s 状态:%s ' % (self.name, self.author, self.comment, status)# 返回书籍信息
Bingo!不过这里老师要介绍一个更符合编程习惯的方法__str__(self)。
在Python中,如果方法名形式是左右带双下划线的,那么就属于特殊方法(如初始化方法),有着特殊的功能。
解释一下:只要在类中定义了__str__(self)方法,那么当使用print打印实例对象的时候,就会直接打印出在这个方法中return的数据。
可能有点绕,看代码会直观一点。我们直接把上述代码里的方法名show_info(self)替换成__str__(self),留意最后一行调用的代码,然后点击运行:
class Book:def __init__(self, name, author, comment, state = 0):self.name = nameself.author = authorself.comment = commentself.state = statedef __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__())
类BookManager的编写

menu()是与用户互动的界面,刚刚我们已经给出了demo:
用户输入数字执行相应的功能,程序内部调用的逻辑应该是:
1.查询所有书籍
# 调用方法show_all_book()
2.添加书籍
# 调用方法add_book()
3.借阅书籍
# 调用方法lend_book()
4.归还书籍
# 调用方法return_book()
5.退出系统
请输入数字选择对应的功能:
class BookManagerdef 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


