我有一个应该充当差异列表的类,该差异列表是从另一个列表计算得出的。 例如,如果我有一个位置列表,则可以使用我的类来动态创建位移列表。 为此,我通过以下方式使用了__getitem__方法: 如果我打印单个元素,效果很好,但是如果我打印整个列表,它会给我: 我想知道我还必须 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我已经为连接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]
你需要理解的基本事情是,对于像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))
(你可以把任何东西放在那里),但是它不那么自然。
您可以返回子列表所代表的row
def __getitem__(self, row):
return self.data[row]
例如
>>> t = Test(2,5)
>>> t.data
[[' ', ' '],
[' ', ' '],
[' ', ' '],
[' ', ' '],
[' ', ' ']]
排好队
>>> t[1]
[' ', ' ']
得到一个元素
>>> t[1][0]
' '
请注意,上面示例中的第二个操作[0]
不需要您定义它,因为它只是从list
调用__getitem__
,因为它就是这样。
只需返回行:
def __getitem__(self, row):
return self.data[row]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.