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
相关产品推荐
相关产品推荐

