当前位置: 首页 > news >正文

python面向对象————图书馆借阅系统(综合练习)

练习题5:图书馆借阅系统(综合练习)
设计一个图书馆借阅系统,综合运用三大特性:
**要求:**
- 基类 `LibraryItem`(封装):
- 私有属性:`__item_id`、`__title`、`__is_borrowed`
- 方法:
- `borrow()`:修改`__is_borrowed`为True
- `return_item()`:修改`__is_borrowed`为False
- ``get_info()`:编号:xx,名称:xx,是否可借阅:是/否
- 派生类(继承与多态):
- `Book`:额外属性 `author`、`pages`,重写 `get_info()`
- `DVD`:额外属性 `director`、`duration`,重写 `get_info()`
- `Magazine`:额外属性 `issue_number`,重写 `get_info()`
- 类 `Library`(组合):
- 属性:物品列表
- 方法:`add_item()`、`remove_item()`、`search_by_title()`、`display_available_items()`
- 实现多态:`display_item_info(item)` 函数能正确显示任何类型物品的信息

""" @Author: @Time:2026/4/15 @Desc:练习题5:图书馆借阅系统(综合练习) 设计一个图书馆借阅系统,综合运用三大特性: **要求:** - 基类 `LibraryItem`(封装): - 私有属性:`__item_id`、`__title`、`__is_borrowed` - 方法: - `borrow()`:修改`__is_borrowed`为True - `return_item()`:修改`__is_borrowed`为False - ``get_info()`:编号:xx,名称:xx,是否可借阅:是/否 - 派生类(继承与多态): - `Book`:额外属性 `author`、`pages`,重写 `get_info()` - `DVD`:额外属性 `director`、`duration`,重写 `get_info()` - `Magazine`:额外属性 `issue_number`,重写 `get_info()` - 类 `Library`(组合): - 属性:物品列表 - 方法:`add_item()`、`remove_item()`、`search_by_title()`、`display_available_items()` - 实现多态:`display_item_info(item)` 函数能正确显示任何类型物品的信息 """ # - 基类 `LibraryItem`(封装): # - 私有属性:`__item_id`、`__title`、`__is_borrowed` # - 方法: # - `borrow()`:修改`__is_borrowed`为True # - `return_item()`:修改`__is_borrowed`为False # - ``get_info()`:编号:xx,名称:xx,是否可借阅:是/否 class LibraryItem: def __init__(self,item_id,title,is_borrowed=False): self.__item_id=item_id self.__title=title self.__is_borrowed = is_borrowed @property def item_id(self): return self.__item_id @property def title(self): return self.__title @property def is_borrowed(self): return "否" if self.__is_borrowed else "是" @item_id.setter def item_id(self,item_id): self.__item_id = item_id @title.setter def title(self,title): self.__title = title @is_borrowed.setter def is_borrowed(self,is_borrowed): print(f"修改is_borrow为{is_borrowed}") self.__is_borrowed=is_borrowed def borrow(self): self.is_borrowed = True def return_item(self): self.is_borrowed = False def get_info(self): print(f"编号:{self.item_id},名称:{self.title},是否可借阅:{self.is_borrowed}") #编号:xx,名称:xx,是否可借阅:是 / 否 # 派生类(继承与多态): # - `Book`:额外属性 `author`、`pages`,重写 `get_info()` # - `DVD`:额外属性 `director`、`duration`,重写 `get_info()` # - `Magazine`:额外属性 `issue_number`,重写 `get_info()` class Book(LibraryItem): def __init__(self,item_id,title,author,pages): super().__init__(item_id, title) self.author = author self.pages = pages def get_info(self): print(f"编号:{self.item_id},名称:{self.title},是否可借阅:{self.is_borrowed},作者:{self.author},共{self.pages}页") class DVD(LibraryItem): def __init__(self,item_id,title,director,duration): super().__init__(item_id, title) self.director =director self.duration = duration def get_info(self): print(f"编号:{self.item_id},名称:{self.title},是否可借阅:{self.is_borrowed},导演:{self.director},时长:{self.duration}") class Magazine(LibraryItem): def __init__(self,item_id,title,issue_number): super().__init__(item_id, title, ) self.issue_number =issue_number def get_info(self): print(f"编号:{self.item_id},名称:{self.title},是否可借阅:{self.is_borrowed},期数:{self.issue_number}") # 类 `Library`(组合): # - 属性:物品列表 # - 方法:`add_item()`、`remove_item()`、`search_by_title()`、`display_available_items()` # - 实现多态:`display_item_info(item)` 函数能正确显示任何类型物品的信息 class Library: def __init__(self,library_name): self.library_name = library_name self.items=[] def add_item(self,LibraryItem): self.items.append(LibraryItem) print(f"图书管物品{LibraryItem.title}已添加") def remove_item(self,item_id): for item in self.items: if item.item_id==item_id: self.items.remove(item) print("恭喜你,物品移除成功") return print("图书馆没有该物品!!!") def search_by_title(self,title): for item in self.items: if title in item.title: item.get_info() return print("不好意思,该物品没有在图书馆") def display_available_items(self): print("\n===== 可借阅物品 =====") for item in self.items: if item.is_borrowed == "是": item.get_info() def display_item_info(self, item): """ 实现多态:显示任何类型物品的信息 :param item: LibraryItem 或其子类的实例 """ if isinstance(item, LibraryItem): item.get_info() else: print("传入的对象不是有效的图书馆物品") if __name__ == "__main__": library = Library("市立图书馆") book1 = Book("B001", "Python编程从入门到实践", "Eric Matthes", 464) book2 = Book("B002", "算法导论", "Thomas H. Cormen", 1312) dvd1 = DVD("D001", "流浪地球", "郭帆", 125) dvd2 = DVD("D002", "星际穿越", "Christopher Nolan", 169) mag1 = Magazine("M001", "读者", "2026年第3期") mag2 = Magazine("M002", "青年文摘", "2026年第5期") print("=== 添加物品 ===") library.add_item(book1) library.add_item(book2) library.add_item(dvd1) library.add_item(dvd2) library.add_item(mag1) library.add_item(mag2) print("\n=== 查看所有可借阅物品 ===") library.display_available_items() print("\n=== 测试借阅功能 ===") book1.borrow() dvd1.borrow() print("\n=== 借阅后查看可借阅物品 ===") library.display_available_items() print("\n=== 多态演示 ===") print("不同物品的信息:") library.display_item_info(book2) library.display_item_info(dvd2) library.display_item_info(mag1) print("\n=== 搜索功能 ===") library.search_by_title("Python") library.search_by_title("地球") print("\n=== 测试归还功能 ===") book1.return_item() print("\n=== 归还后查看可借阅物品 ===") library.display_available_items() print("\n=== 测试移除物品 ===") library.remove_item("M002") library.display_available_items()
http://www.jsqmd.com/news/653942/

相关文章:

  • CLIP-GmP-ViT-L-14图文匹配工具惊艳效果展示:Softmax置信度进度条可视化
  • 元机器人codebuddy开发实践,阶段一:搭建元智能体基础框架
  • 保姆级教程:在Ubuntu 20.04上从源码编译Carla 0.9.4(含Anaconda环境配置与UE4.21.2安装)
  • 从Focal Loss到ASL:多标签分类损失函数演进史与实战选型指南
  • 三步掌握百度网盘秒传:永久分享文件不再失效
  • 5分钟学会mPLUG视觉问答:本地图片分析工具搭建教程
  • 元机器人codebuddy开发实践,阶段二:接入沙箱 + 3D 建模模块生成智能体
  • LFM2.5-1.2B-Thinking完整教程:Ollama环境配置、模型使用与高级功能
  • 别再拍脑袋估算了!手把手教你用山东新规里的‘功能点法’算准软件开发预算
  • 如何用树状书签管理工具彻底解决浏览器书签混乱问题?
  • Vision Pro 8.4 保姆级安装教程:从下载到激活,手把手带你避开许可证过期坑
  • https://www.cnblogs.com/Un1corn/p/18615567
  • 从流体模拟到电磁场:梯度、散度、旋度在Unity/Blender中的3D可视化实战
  • SUPER COLORIZER色彩科学解析:模型如何学习并再现人类色彩认知
  • Qwen2.5-7B-Instruct商业应用:广告公司创意文案+分镜脚本生成
  • 别再死磕手册了!STM32F429以太网实战:手把手教你搞定MAC与PHY芯片选型与连接
  • 告别STM32,试试用FPGA+Verilog做超声波测距:精度与实时性的提升实战
  • C 语言转义字符算字节的完整规则
  • CC3200 Launchpad烧录避坑指南:TI Uniflash详细配置与常见错误解决
  • FUTURE POLICE在在线教育中的应用:如何为课程视频生成逐字对齐字幕
  • 别再默认轮询16台了!台达PLC-LINK高效通讯的M1355手动联机配置详解
  • 10分钟掌握Whisper-WebUI:如何免费快速完成语音转文字?
  • PMC P460-B4阵列卡在华三服务器上的RAID配置详解:从RAID1/RAID6选择到热备盘(专用 vs 自动替换)的实战对比
  • 为什么你的LangChain应用无法复现线上问题?生成式AI链路追踪的5个反直觉真相(内部审计报告首次公开)
  • Telemetry技术在现代网络运维中的高效应用
  • 告别PS!用Qwen-Image-Edit-2511实现智能抠图、局部重绘,简单3步
  • Spring AI 智能体开发实战:基于 Java 的落地方案详解
  • 别再手动催周报了!用泛微OA E9的提醒功能,5分钟搞定每周五自动邮件提醒
  • 汇川AM600系列硬件组态实战:从IO模块到伺服驱动的完整配置流程
  • B站缓存视频无法播放?m4s-converter让您的收藏永不消失