繁体   English   中英

__getitem__ 用于索引 class 对象

[英]__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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM