我已经为连接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] 我已经看了一些过去的问题,但我似乎无法找到我正在寻找的答案。

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

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

#1楼 票数:6 已采纳

你需要理解的基本事情是,对于像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]这样合法的语法 - 它会将(1,2)作为元组调用b.__getitem__((1,2)) (你可以把任何东西放在那里),但是它不那么自然。

#2楼 票数:3

您可以返回子列表所代表的row

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

例如

>>> t = Test(2,5)
>>> t.data
[[' ', ' '],
 [' ', ' '],
 [' ', ' '],
 [' ', ' '],
 [' ', ' ']]

排好队

>>> t[1]
[' ', ' ']

得到一个元素

>>> t[1][0]
' '

请注意,上面示例中的第二个操作[0]不需要您定义它,因为它只是从list调用__getitem__ ,因为它就是这样。

#3楼 票数:1

只需返回行:

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

  ask by rookie translate from so

未解决问题?本站智能推荐:

2回复

__getitem__在列表列表上有切片

我正在创建一个代表列表列表的类。 __getitem__使我头疼。 一切都进行得很顺利,直到我引入slice作为参数为止。 示范代码 输出如下 显然,正在发生的事情是第二个[]运算符调用被应用到第一个[...]运算符的调用,但仍停留在最外层列表的上下文中。 解决方案使我难以理解
1回复

__getitem__表示列表与词典

Dictionary __getitem__方法似乎与List的工作方式不同,这让我感到头疼。 这就是我的意思: 如果我是子类列表 ,我可以将__getitem__重载为: 但是,如果我将dict子类化,则__getitem__不会公开索引 ,而是键入,如: 那么,我的问题是如何拦
1回复

为嵌套列表覆盖__getitem__?

我正在实现一个实验QR码解析器,我认为覆盖列表的__getitem__会很方便,该__getitem__将给定的掩码考虑在内,如下所示: 如何以最Python的方式实现它?
2回复

使用python中的__getitem__作为列表的打印类

我有一个应该充当差异列表的类,该差异列表是从另一个列表计算得出的。 例如,如果我有一个位置列表,则可以使用我的类来动态创建位移列表。 为此,我通过以下方式使用了__getitem__方法: 如果我打印单个元素,效果很好,但是如果我打印整个列表,它会给我: 我想知道我还必须实现什么其
1回复

在python上覆盖__getitem__

我想覆盖类上的__getitem__方法。 我知道有类似的问题,但我想更准确和清楚。 我如何使这项工作:class A: def __init__(self, l: list): self.l = l def __getitem__(self, i: int): return self.
2回复

修改__getitem__后无法对列表进行切片

对于特定用例,我想定义一个列表类,如果索引为负数或超出范围,则返回 0。 我目前的方法已经服务于特定目的: 但不幸的是,它在切片列表时会导致一些不良行为: 有没有办法解决这个问题?
3回复

为什么多个列表索引可以用于__getitem__而不是__setitem__

考虑以下代码: 输出: 为什么我可以调用myMDL2[0][0][0]并且__getitem__适当地处理它,但是尝试分配给该索引不会调用__setitem__ 。 myMDL2[0][0][0] = 12正在通过__getitem__创建对正确索引的引用并以此方式设置。 这意味着我想在__set
2回复

列表切片如何挂钩到__getitem__?[重复]

这个问题在这里已有答案: 自定义Python切片,请提供 1个答案 为什么第二种情况不使用List.__getitem__ ? 它用什么代替? 同样,为什么这里的差异不是这两个切片操作?