You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
git-test/book_manager.py

181 lines
5.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import json
import os
from datetime import datetime
class BookManager:
"""图书管理类,负责图书信息的增删改查操作"""
def __init__(self, data_file='books.json'):
"""初始化图书管理器,加载已有图书数据"""
#self.data_file = data_file 111111111111111111122222222222
#self.books = self._load_books()
def _load_books(self):
"""从文件加载图书数据"""
if os.path.exists(self.data_file):
try:
with open(self.data_file, 'r', encoding='utf-8') as f:
return json.load(f)
except (json.JSONDecodeError, IOError) as e:
print(f"加载图书数据失败: {e}")
return []
return []
def _save_books(self):
"""将图书数据保存到文件"""
try:
with open(self.data_file, 'w', encoding='utf-8') as f:
json.dump(self.books, f, ensure_ascii=False, indent=2)
return True
except IOError as e:
print(f"保存图书数据失败: {e}")
return False
def add_book(self, isbn, title, author, category, quantity=1):
"""
添加新图书
参数:
isbn (str): 图书ISBN编号
title (str): 图书标题
author (str): 图书作者
category (str): 图书分类
quantity (int): 图书数量默认为1
返回:
bool: 添加成功返回True失败返回False
"""
# 检查ISBN是否已存在
for book in self.books:
if book['isbn'] == isbn:
print(f"错误: ISBN为 {isbn} 的图书已存在")
return False
new_book = {
'isbn': isbn,
'title': title,
'author': author,
'category': category,
'quantity': quantity,
'available': quantity, # 可借阅数量
'added_date': datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
self.books.append(new_book)
return self._save_books()
def search_books(self, keyword=None, category=None, author=None):
"""
搜索图书
参数:
keyword (str): 标题或ISBN中的关键词
category (str): 图书分类
author (str): 作者名
返回:
list: 符合条件的图书列表
"""
results = []
for book in self.books:
match = True
if keyword and keyword not in book['title'] and keyword not in book['isbn']:
match = False
if category and book['category'] != category:
match = False
if author and author not in book['author']:
match = False
if match:
results.append(book)
return results
def update_book(self, isbn, **kwargs):
"""
更新图书信息
参数:
isbn (str): 图书ISBN编号
** kwargs: 要更新的字段如title, author, category, quantity等
返回:
bool: 更新成功返回True失败返回False
"""
for book in self.books:
if book['isbn'] == isbn:
# 计算可借阅数量的变化
if 'quantity' in kwargs:
quantity_change = kwargs['quantity'] - book['quantity']
book['available'] += quantity_change
# 更新字段
for key, value in kwargs.items():
if key in book:
book[key] = value
return self._save_books()
print(f"错误: 未找到ISBN为 {isbn} 的图书")
return False
def delete_book(self, isbn):
"""
删除图书
参数:
isbn (str): 图书ISBN编号
返回:
bool: 删除成功返回True失败返回False
"""
initial_count = len(self.books)
self.books = [book for book in self.books if book['isbn'] != isbn]
if len(self.books) < initial_count:
return self._save_books()
print(f"错误: 未找到ISBN为 {isbn} 的图书")
return False
def get_book_details(self, isbn):
"""获取图书详细信息"""
for book in self.books:
if book['isbn'] == isbn:
return book
return None
def list_all_books(self):
"""列出所有图书"""
return self.books
# 示例用法
if __name__ == "__main__":
manager = BookManager()
# 添加示例图书
manager.add_book("9780134685991", "Effective Python", "Brett Slatkin", "Programming", 5)
manager.add_book("9780596007126", "Head First Design Patterns", "Eric Freeman", "Programming", 3)
manager.add_book("9780141988511", "Sapiens: A Brief History of Humankind", "Yuval Noah Harari", "History", 4)
print("所有图书:")
for book in manager.list_all_books():
print(f"{book['title']} by {book['author']} (ISBN: {book['isbn']}) - 可借: {book['available']}/{book['quantity']}")
print("\n搜索编程类图书:")
programming_books = manager.search_books(category="Programming")
for book in programming_books:
print(f"- {book['title']}")
print("\n更新图书数量:")
manager.update_book("9780134685991", quantity=7)
book = manager.get_book_details("9780134685991")
print(f"更新后数量: {book['available']}/{book['quantity']}")
print("\n删除图书:")
manager.delete_book("9780596007126")
print(f"删除后剩余图书数量: {len(manager.list_all_books())}")