你好! 经常有粉丝在后台问我:“小编,我Python基础语法(列表、字典、循环、函数)都学会了,但是一到自己写东西就懵逼,有没有什么项目能把这些知识点串起来? ”
我的回答永远是:做一个“图书管理系统”!
别小看这个项目,它虽然被写烂了,但它是检验你是否掌握、面向对象编程(OOP)数据持久化(文件存储)业务逻辑处理以及的试金石。
今天,我就用的视角,手把手带你从零实现一个资深博主Python控制台版图书管理系统。 不仅有代码,更有设计思路。
1. 为什么是它?
在开始敲代码之前,我们要先搞清楚,这个项目能帮你打通哪几条“任督二脉”:
- 面向对象思维 (OOP):如何把书抽象成类,把图书馆抽象成书图书馆类。
- CRUD操作:增(Add)、删(Remove)、改(Borrow/Return)、查(Search),这是所有系统的核心。
- 数据持久化:程序关闭后数据不丢失,我们这次用文件来模拟数据库。
- 交互逻辑:如何写一个死循环菜单,让用户一直操作直到选择退出。
2. 系统设计(蓝图)
我们要做的系统包含两个核心类:
- Book(书籍类):
- 属性:书名、作者、ISBN(唯一标识)、是否借出。
- LibraryManager(管理类):
- 属性:包含所有书籍的列表。
- 方法:添加书籍、查询书籍、借书、还书、保存数据、加载数据。
3. 代码实战(干货时刻)
我们要写得专业点,用上,这才是Python 3.x该有的样子。Type Hinting(类型提示)
第一步:定义书籍模型
import jsonimport osfrom typing import List, Dict# 数据存储的文件名DATA_FILE = "library_data.json"class Book: def __init__(self, title: str, author: str, isbn: str, is_borrowed: bool = False): self.title = title self.author = author self.isbn = isbn # ISBN作为唯一ID self.is_borrowed = is_borrowed def __str__(self): status = "已借出" if self.is_borrowed else "可借阅" return f"[{status}] 《{self.title}》 | 作者: {self.author} | ISBN: {self.isbn}" # 将对象转换为字典,方便存入JSON def to_dict(self) -> Dict: return { "title": self.title, "author": self.author, "isbn": self.isbn, "is_borrowed": self.is_borrowed } 第二步:核心管理逻辑
这是整个程序的“大脑”。注意看和save_dataload_data,这是让你的程序“拥有记忆”的关键。
class LibraryManager: def __init__(self): self.books: List[Book] = [] self.load_data() # 启动时自动加载数据 def add_book(self, title: str, author: str, isbn: str): # 检查ISBN是否重复 for book in self.books: if book.isbn == isbn: print(f" 错误:ISBN {isbn} 已存在!") return new_book = Book(title, author, isbn) self.books.append(new_book) self.save_data() print(f" 成功添加书籍:《{title}》") def list_books(self): if not self.books: print(" 图书馆目前是空的。") return print("-" * 30) print(" 图书列表:") for book in self.books: print(book) print("-" * 30) def borrow_book(self, isbn: str): for book in self.books: if book.isbn == isbn: if book.is_borrowed: print(f" 《{book.title}》 已经被借走了。") else: book.is_borrowed = True self.save_data() print(f" 成功借阅:《{book.title}》") return print(" 未找到该ISBN对应的书籍。") def return_book(self, isbn: str): for book in self.books: if book.isbn == isbn: if not book.is_borrowed: print(f" 《{book.title}》 并没有被借出。") else: book.is_borrowed = False self.save_data() print(f" 成功归还:《{book.title}》") return print(" 未找到该ISBN对应的书籍。") def save_data(self): """将书籍列表保存到JSON文件""" data = [book.to_dict() for book in self.books] try: with open(DATA_FILE, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=4) except Exception as e: print(f" 保存数据失败: {e}") def load_data(self): """从JSON文件加载数据""" if not os.path.exists(DATA_FILE): return # 文件不存在则跳过 try: with open(DATA_FILE, 'r', encoding='utf-8') as f: data = json.load(f) self.books = [Book(**item) for item in data] # 列表推导式+解包,高级写法 except Exception as e: print(f" 加载数据失败: {e}") 第三步:用户界面(CLI)
写个漂亮的菜单,让用户知道怎么操作。
def main(): manager = LibraryManager() while True: print("\n" + "="*10 + " Python图书管理系统 " + "="*10) print("1. 添加图书") print("2. 显示所有图书") print("3. 借阅图书") print("4. 归还图书") print("5. 退出系统") choice = input(" 请输入选项 (1-5): ") if choice == '1': title = input("请输入书名: ") author = input("请输入作者: ") isbn = input("请输入ISBN: ") manager.add_book(title, author, isbn) elif choice == '2': manager.list_books() elif choice == '3': isbn = input("请输入要借阅的ISBN: ") manager.borrow_book(isbn) elif choice == '4': isbn = input("请输入要归还的ISBN: ") manager.return_book(isbn) elif choice == '5': print(" 感谢使用,再见!") break else: print(" 输入无效,请重试。")if __name__ == "__main__": main() 4. 代码解析(经验谈)
很多初学者代码能跑,但写得“不够味”。我在上面的代码里埋了几个:进阶技巧
- JSON序列化:
我们没有用复杂的数据库(MySQL/SQLite),而是用了模块。这是轻量级项目存储数据的首选。json
load_data里的 是 Python 的[Book(**item) for item in data]字典解包技巧,能瞬间把字典转回对象,非常优雅。
- 文件编码:
在 时一定要指定 ,否则在 Windows 上存中文书名可能会乱码,这是新手最容易踩的坑。open()encoding='utf-8'
- 分离关注点:
LibraryManager类只管业务逻辑。
这种结构叫做,方便以后维护。高内聚,低耦合
5. 想要更进一步?(课后作业)
如果你觉得上面的代码太简单,不妨尝试以下几个挑战,能做出来你就算入门了:
- 挑战Lv1:添加“搜索功能”,支持按书名模糊查找(提示:使用 关键字)。in
- 挑战Lv2:换掉 ,使用 Python 自带的 JSONsqlite3 库,真正实现关系型数据库存储。
- 挑战Lv3:嫌黑底白字的命令行太丑?试着用 或者 TkinterPyQt 给它加个图形化界面(GUI)。
6. 结语
编程从来不是看会的,而是敲会的。
把上面的代码复制到你的编辑器里(推荐 VS Code 或 PyCharm),跑起来,试试看添加几本书,关掉程序再打开,看看书还在不在。
如果你在这个过程中遇到了报错,恭喜你,那才是你真正学到东西的时刻!
源码已经都在文章里了,觉得有用的话,点个赞支持一下小编!你的关注是我更新的动力!

