You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python主函数中更新Librarycard类对象实现图书归还功能的技术问题

解决Librarycard实例借阅记录更新问题

你遇到的核心问题是没有建立「被借阅图书」和「对应的Librarycard实例」之间的关联——你的borrowed_books只是个列表,只记录了哪些书被借了,但完全不知道是谁借的,自然找不到对应的卡片去调用return_book方法更新私有字典__loan。

下面是具体的解决方案和代码修改建议:

问题根源分析

当前你的全局borrowed_books列表仅存储图书编号,丢失了「图书→借阅者卡片」的映射关系。归还图书时,你需要知道这本书是哪个Librarycard实例借的,才能调用它的return_book方法,从该实例的__loan字典中移除图书记录。

解决方案步骤

  1. 重构全局借阅记录:把borrowed_books从列表改成字典,键为图书编号,值为对应的Librarycard实例,这样能直接通过图书找到借阅者卡片。
  2. 封装借阅逻辑:给Librarycard类添加borrow_book方法,负责将图书添加到私有字典__loan中,避免直接操作私有属性。
  3. 完善归还流程:归还时先从全局字典中取出对应卡片实例,调用其return_book方法更新借阅记录,再移除全局记录。

修改后的完整代码

# 默认借阅时长为3周
LOAN_TIME = 3

class Librarycard:
    def __init__(self, card_id, card_holder):
        self.__id = card_id
        self.__holder = card_holder
        # 存储图书与对应借阅时长的字典,后续函数中会更新
        self.__loan = {}
    
    def borrow_book(self, book):
        """封装图书借阅逻辑,将图书添加到私有借阅字典"""
        self.__loan[book] = LOAN_TIME
        print(f"[{self.__id}] {self.__holder} 成功借阅图书: {book}")
    
    def return_book(self, book):
        """处理图书归还,从私有借阅字典中移除指定图书"""
        if book in self.__loan:
            del self.__loan[book]
            print(f"[{self.__id}] {self.__holder} 成功归还图书: {book}")
        else:
            print(f"[{self.__id}] {self.__holder} 的借阅记录中没有图书: {book}")

def main():
    # 全局借阅记录:键=图书编号,值=对应的Librarycard实例
    borrowed_books = {}
    # 全局卡片管理:模拟从文件加载的卡片实例(实际可从文件读取后构建)
    cards = {
        "C001": Librarycard("C001", "Alice"),
        "C002": Librarycard("C002", "Bob")
    }

    while True:
        command = input("\n请输入命令 (B=借阅, R=归还, Q=退出): ").strip().upper()
        if command == "Q":
            print("程序结束")
            break
        elif command == "B":
            card_id = input("请输入卡号: ").strip()
            book = input("请输入图书编号: ").strip()
            
            # 验证卡号有效性
            if card_id not in cards:
                print("错误:无效的卡号")
                continue
            # 验证图书是否已被借阅
            if book in borrowed_books:
                print("错误:该图书已被借阅")
                continue
            
            # 执行借阅操作
            target_card = cards[card_id]
            target_card.borrow_book(book)
            borrowed_books[book] = target_card
        elif command == "R":
            book = input("请输入要归还的图书编号: ").strip()
            
            if book not in borrowed_books:
                print("错误:该图书未被任何人借阅")
                continue
            
            # 获取对应的借阅卡片实例,更新其借阅记录
            target_card = borrowed_books[book]
            target_card.return_book(book)
            # 移除全局借阅记录
            del borrowed_books[book]
            print("图书归还流程完成")
        else:
            print("错误:无效命令,请重新输入")

if __name__ == "__main__":
    main()

关键修改说明

  • 全局借阅记录重构:borrowed_books字典实现了「图书→卡片」的直接映射,解决了归还时找不到对应实例的问题。
  • 封装类方法:borrow_book和return_book方法封装了对私有属性__loan的操作,符合面向对象的封装原则,避免直接修改私有属性。
  • 错误处理增强:添加了卡号验证、图书状态验证等逻辑,避免运行时出现KeyError等异常。

实际应用中,你可以把cards字典的初始化逻辑替换成从文件读取卡号和姓名的代码,这样就能和你最初的需求(Librarycard类读取文件初始化实例)结合起来了。

内容的提问来源于stack exchange,提问作者Alsakka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 14:47:50