![](/img/trans.png)
[英]How to define an indexing method within a class (__getitem__ attempted)
[英]__getitem__ for indexing class objects
我正在尝试索引下面的 book_list object 以便能够访问 Books 对象(book1 和 book2)中属性“title”和“year”的值:
编码:
class Books:
def __init__(self, title ='', year = 1):
self.title = title
self.year = year
def __getitem__(self):
return self.title
return self.year
class BookList(Books):
def __init__(self):
self.book_list = []
def store_book(self, book):
self.book_list.append(book)
def __getitem__(self):
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()
当前output:
TypeError: __getitem__() takes 1 positional argument but 2 were given
所需的 output:
Title 1 1000
Title 2 1211
我尝试了您的代码并进行了一些小调整。 而不是以下代码:
def showbook(self):
for book in self.book_list:
print(book[0], book[1])
我相信您只需要以下代码:
def showbook(self):
for book in self.book_list:
print(book.title, book.year)
当我使用该调整测试程序时,以下是我终端上的 output。
@Una:~/Python_Programs/Books$ python3 Books.py
Title 1 1000
Title 2 1211
测试一下,看看它是否能解决您的问题。
附加说明以回应您的评论。
看来,当初始化 function 中的属性被定义为您拥有它们时,它们只是单独的属性,并且不会被视为可以索引的列表。 在此基础上,我确实重做了初始化 function,如下所示:
class Books:
def __init__(self, title ='', year = 1):
self.book = []
self.book.append(title)
self.book.append(year)
然后,这些属性是列表的一部分,并且您的原始代码块有效。
def showbook(self):
for book in self.book_list:
print(book[0], book[1])
底线是 Python 在 class 中如何定义属性方面似乎很挑剔。
如果您想将其用作book[0]
,则需要为__getitem__
提供索引
In [1]: class Books:
...: def __init__(self, title ='', year = 1):
...: self.data = (title, year)
...:
...: def __getitem__(self, idx):
...: if idx < 2:
...: return self.data[idx]
...: else:
...: raise IndexError
...:
...:
...: class BookList(Books):
...: 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
如果你想使用book['title']
然后修改几行:
In [2]: class Books:
...: def __init__(self, title ='', year = 1):
...: self.data = {'title': title, 'year': year}
...:
...: def __getitem__(self, idx):
...: return self.data[idx]
然后将showbook修改为:
...: def showbook(self):
...: for book in self.book_list:
...: print(book['title'], book['year'])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.