import os.path
import pickle
class Book(object):
def __init__(self, num, name, position):
self.num = num
self.name = name
self.position = position
# 重写对象的to_string方法,返回对象的属性值格式
def __str__(self): # self对象本身
# \t空格
return f"{self.num}\t{self.name}\t{self.position}"
class BookManage(object):
book_list = []
def __init__(self): # 构造方法
# __init__方法在对象被初始化的时候,自动执行
# 避免异常的两种方法:1、加判断(事前) 2、异常处理(事后)
if not os.path.isfile("book.data"):
# 确保每次运行程序前,先把book.data文件中所有内存加载到book_list中
pickle.dump(self.book_list, open("book.data", "wb")) # 新增一个对象文件
"""加载文件到内存,将一个对象保存到某个文件中"""
self.book_list = pickle.load(open("book.data", "rb")) # 把文件的内容加载到内存
# try:
# self.book_list = pickle.load(open("book.data", "rb"))
# except FileNotFoundError as e:
# print("文件不存在")
# pickle.dump(self.book_list, open("book.data", "wb"))
# print("文件创建")
# 显示所有图书
def show_book_list(self):
for book in self.book_list:
print(book)
# 添加图书,将book对象作为方法入参,book是一个变量 Book是一个类型 对某个变量限定类型
def add_book(self, book: Book):
self.book_list.append(book)
# 根据图书名称查询某本书籍是否存在
def show_book_by_name(self,name: str):
for book in self.book_list:
if book.name == name:
# 显示查询的书籍信息
print(book)
break
else:
print("查询的书籍不存在")
# 根据图书名称删除图书
def del_book_by_name(self, name: str):
for i, book in enumerate(self.book_list):
if book.name == name:
# 根据下标删除书籍
del self.book_list[i]
# # remove方法
# self.book_list.remove(book)
break
else:
print("删除的书籍不存在")
# 获取列表最后一行的编号id property将方法转化为属性
@property
def last_book_id(self):
# 如果列表不为空
if self.book_list:
# 获取列表最后一本书的num属性值
return self.book_list[-1].num
# 列表为空,返回0
return 0
def __del__(self): # 析构方法
"""加载内存中的数据保存到文件"""
# __del__在对象被销毁的时候自动执行
pickle.dump(self.book_list, open("book.data", "wb")) # 把对象保存到磁盘
if __name__ == '__main__':
book = Book(1, "笑傲江湖", "第1层第1行")
print(book)