Python类索引问题:__getitem__报错及预期输出实现
问题分析与修复
错误原因
__getitem__方法参数缺失:Python的__getitem__魔法方法必须接收self和key(索引或键值)两个参数,你写的两个类的__getitem__都只定义了self,当调用book[0]时,Python会自动传入self和0两个参数,直接触发参数不匹配的TypeError。- 不必要的继承:
BookList是用来管理多个Books实例的容器,完全不需要继承Books类,继承反而会混淆类的职责。 - 未定义变量使用:
BookList的__getitem__里用了index变量,但这个变量根本没定义,应该把它作为方法参数传入。
修复后的代码
class Books: def __init__(self, title='', year=1): self.title = title self.year = year def __getitem__(self, key): # 根据索引返回对应属性,0返回title,1返回year if key == 0: return self.title elif key == 1: return self.year else: raise IndexError("索引超出范围,仅支持0或1") class BookList: def __init__(self): self.book_list = [] def store_book(self, book): self.book_list.append(book) def __getitem__(self, index): # 返回列表中对应索引的书籍实例 return self.book_list[index] def showbook(self): for book in self.book_list: print(book[0], book[1]) book1 = Books('Title 1', 1000) book2 = Books('Title 2', 1211) book_list = BookList() book_list.store_book(book1) book_list.store_book(book2) book_list.showbook()
运行结果
Title 1 1000 Title 2 1211
内容的提问来源于stack exchange,提问作者luca kramp
相关产品推荐
相关产品推荐

