Python中向独立变量的列表追加Book类对象的实现问题排查
Python图书管理系统列表追加对象问题修复方案
核心疑问解答
- 分号仅为解析
books.txt文本行的分隔符,内存中操作Book对象完全不需要携带分号。只有后续需要把内存数据写回txt文件持久化时,才需要把对象属性拼接为分号分隔的文本行。 - 之前
append()不生效的核心原因有两个:- 原代码中存储图书的
books列表是inventory()方法的内部局部变量,每次调用显示库存时才临时从文件读取生成,方法执行完毕就会被销毁,没有常驻内存的列表可供追加对象 - 菜单选择新增图书时,仅调用了
input_book()创建Book实例,但没有把返回的实例存入任何列表,创建完成后对象就被回收了
- 原代码中存储图书的
具体修改步骤
1. 提取常驻内存的共享图书列表
把图书列表定义为Book类的类属性,程序启动时一次性从文件加载所有图书数据,不要在每次显示库存时重复读取文件创建列表:
class Book: # 类级别共享的图书列表,全程序运行期间常驻内存 books = [] def __init__(self, title, author, isbn, callnumber, stock, loaned): self.title = title self.author = author self.isbn = isbn self.callnumber = callnumber self.stock = stock self.loaned = loaned self.available = int(self.stock)-int(self.loaned) # 原有的getXxx方法、__repr__方法、input_book方法保持不变即可 @staticmethod def load_inventory_from_file(): """程序启动时调用一次,从文件加载初始库存到内存列表""" Book.books.clear() with open("books.txt", "r", encoding="utf-8") as inventoryfile: for line in inventoryfile: strip_line = line.strip() if not strip_line: continue book_attrs = strip_line.split(";") book = Book( book_attrs[0],book_attrs[1],book_attrs[2], book_attrs[3],book_attrs[4],book_attrs[5] ) Book.books.append(book)
2. 修改库存显示逻辑
原inventory()方法不需要每次重新读文件建列表,直接遍历内存中已有的共享图书列表即可,同时补上原代码缺失的属性取值逻辑(原代码中调用的fields()函数未定义):
@staticmethod def inventory(): fmtstring = '''{:<50}\t{:<20}\t{:<13}\t{:<13}\t{:<10}\t{:<10}\t{:<10}''' print(fmtstring.format("Name","Author","ISBN","Call Number","Stock","Loaned","Available")) for book in Book.books: print(fmtstring.format( book.title, book.author, book.isbn, book.callnumber, book.stock, book.loaned, book.available ))
3. 修改菜单新增图书逻辑
拿到input_book()返回的新Book实例后,直接追加到共享列表中即可,同时替换有安全风险的eval()输入处理:
# 程序启动先加载一次文件中的初始库存 Book.load_inventory_from_file() while True: print() print("Westlands Book Inventory Management Subsystem") print("1. Display Inventory") print("2. Add a Book") print("3. Remove a Book") print("4. Export Inventory") print("5. Quit IMS") choice = int(input("Select an option from the menu> ")) if choice == 1: print() print("Displaying Westlands Books Inventory") print() Book.inventory() elif choice == 2: print() print("Adding a Book") print() new_book = Book.input_book() # 把新创建的图书实例追加到常驻内存的列表中 Book.books.append(new_book) print() print('Book added successfully.')
补充说明
当前新增的图书仅保存在内存中,程序退出后数据会丢失。如果需要持久化保存,在实现导出库存功能时,遍历
Book.books列表,把每个Book对象的属性用分号拼接成文本行写回books.txt即可。
内容的提问来源于stack exchange,提问作者JadronAU
相关产品推荐
相关产品推荐

