gpt4 book ai didi

Python:列表列表 __getitem__

转载 作者:太空宇宙 更新时间:2023-11-03 12:39:23 29 4
gpt4 key购买 nike

我为使用列表列表的 connect 4 游戏创建了一个 Board 类。我想让对象支持对面板的行和列进行索引:

class Test:
def __init__(self, cols, rows):
self.cols = cols
self.rows = rows
self.data = [[' '] * cols for row in range(rows)]

def __iter__(self):
yield from self.data

def __getitem__(self, row):
pass
# what should this be?

我知道我需要定义 __getitem__ 但是这个方法应该是什么来允许像 b[1][1] 这样的语法?我看过some past questions但我似乎找不到我要找的答案。

编辑:也许以下是正确的做事方式?

def __getitem__(self, row):
return self.data[row]

最佳答案

您需要了解的基本内容是,对于像 b[1][2] 这样的语法,有 两个 __getitem__ 调用。首先,调用 b.__getitem__(1) 并返回一个对象。然后,调用 returned_object.__getitem__(2)。因此,无论 b 是什么类,都不能完全控制整个过程。

在你上面的例子中,如果你将它定义为

def __getitem__(self, row):
return self.data[row]

然后 b[1][2] 将首先调用 b.__getitem__(1),它将返回 self.data[1],这将是一个列表。该列表还支持 __getitem__,因此将调用下一个 list.__getitem__(2)

如果你想控制其中的两者,那么你需要定义另一个代表列的类,父类需要返回这些对象之一而不是原始列表,然后可以为自定义功能实现自己的 __getitem__

其他选择是支持像 b[1,2] 这样合法的语法——它会用 调用 b.__getitem__((1,2)) >(1,2) 作为一个元组(你可以在里面放任何东西),但它不是那么自然。

关于Python:列表列表 __getitem__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27951458/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com