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

Python图书馆OOP系统租赁类跨类对象操作与输出优化问题

简易图书馆OOP程序租赁类实现方案

已实现的功能类(修正缩进后)

1. Books类及子类BookList

原代码存在缩进错误(__init__方法未缩进在类内部),修正后如下:

class Books(object):
    def __init__(self, book_id, book_title):
        self.book_id = book_id
        self.book_title = book_title

# 示例使用
book2 = Books('1504231', 'Murders')
class BookList:
    def __init__(self):
        self.listbook = []
    
    def add_book_object(self, book):
        self.listbook.append(book)
    
    def show_books(self):
        for book in self.listbook:
            print([book.book_id, book.book_title])

# 示例使用
book_list = BookList()
book_list.add_book_object(book2)
book_list.show_books()

2. Users类及子类UserList

class Users(object):
    def __init__(self, user_id, user_name):
        self.user_id = user_id
        self.user_name = user_name

# 示例使用
user1 = Users('adfelko', 'Adam')
class UserList:
    def __init__(self):
        self.listuser = []
    
    def add_user_object(self, user):
        self.listuser.append(user)
    
    def show_users(self):
        for user in self.listuser:
            print([user.user_id, user.user_name])

# 示例使用
user_list = UserList()
user_list.add_user_object(user1)
user_list.show_users()

待解决的Leases类问题

需求:构建Leases类存储用户与书籍的租赁关系,每个记录对应一个Users对象和一个Books对象,期望输出格式为[ ['adfelko','Adam'],['1504231','Murders'] ],同时支持访问、修改对应Users和Books对象的属性。

之前的尝试中,打印租赁记录时输出对象内存地址,原因是未重写基础类的__str__方法,且租赁类的存储和展示逻辑未正确提取对象属性。

解决方案

1. 完善基础类的属性导出方法

给Books和Users类添加to_list方法用于返回属性列表,同时重写__str__方法方便直接打印对象:

class Books(object):
    def __init__(self, book_id, book_title):
        self.book_id = book_id
        self.book_title = book_title
    
    def to_list(self):
        return [self.book_id, self.book_title]
    
    def __str__(self):
        return str(self.to_list())

class Users(object):
    def __init__(self, user_id, user_name):
        self.user_id = user_id
        self.user_name = user_name
    
    def to_list(self):
        return [self.user_id, self.user_name]
    
    def __str__(self):
        return str(self.to_list())

2. 实现正确的Leases类

采用组合模式而非继承,存储租赁记录为(用户对象, 书籍对象)的元组,实现添加、删除、展示功能:

class Leases:
    def __init__(self):
        self.leases = []  # 存储格式: [(user_obj, book_obj), ...]
    
    def add_lease(self, user, book):
        # 避免重复添加同一租赁记录
        if (user, book) not in self.leases:
            self.leases.append((user, book))
    
    def remove_lease(self, user, book):
        if (user, book) in self.leases:
            self.leases.remove((user, book))
    
    def show_leases(self):
        for user, book in self.leases:
            print([user.to_list(), book.to_list()])
    
    # 支持按用户ID查找租赁记录,用于修改属性
    def get_lease_by_user(self, user_id):
        for user, book in self.leases:
            if user.user_id == user_id:
                return (user, book)
        return None

3. 测试代码及输出

# 创建测试对象
user1 = Users('adfelko', 'Adam')
user2 = Users('jdoe', 'John')
book2 = Books('1504231', 'Murders')
book3 = Books('1504232', 'Python Basics')

# 初始化租赁类
lease_system = Leases()
lease_system.add_lease(user1, book2)
print("--- 首次添加租赁记录 ---")
lease_system.show_leases()

lease_system.add_lease(user2, book3)
print("\n--- 添加第二条租赁记录 ---")
lease_system.show_leases()

lease_system.remove_lease(user2, book3)
print("\n--- 删除第二条租赁记录 ---")
lease_system.show_leases()

# 示例:修改租赁记录中的用户属性
target_lease = lease_system.get_lease_by_user('adfelko')
if target_lease:
    user, book = target_lease
    user.user_name = 'Adam Smith'
    print("\n--- 修改用户名称后 ---")
    lease_system.show_leases()

预期输出:

--- 首次添加租赁记录 ---
[['adfelko', 'Adam'], ['1504231', 'Murders']]

--- 添加第二条租赁记录 ---
[['adfelko', 'Adam'], ['1504231', 'Murders']]
[['jdoe', 'John'], ['1504232', 'Python Basics']]

--- 删除第二条租赁记录 ---
[['adfelko', 'Adam'], ['1504231', 'Murders']]

--- 修改用户名称后 ---
[['adfelko', 'Adam Smith'], ['1504231', 'Murders']]

关键说明

  • 避免继承Users和Books:租赁关系是用户和书籍的关联,而非它们的子类,组合模式更符合业务逻辑。
  • 直接访问对象属性:通过Leases类返回的用户/书籍对象,可以直接修改其属性(如user.user_name = 'new_name'),修改后会同步到所有引用该对象的地方。
  • 重写__str__和to_list:统一对象的属性输出格式,满足预期的展示需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:27:46