Python:对象不支持索引操作

22 投票
1 回答
100353 浏览
提问于 2025-04-17 22:42

是的,这个问题之前有人问过。可是,我看过的答案都没法解决我遇到的问题。

我正在尝试制作一个简单的弹跳游戏。我是这样创建砖块的:

def __init__(self,canvas):
    self.canvas = canvas
    self.brick1 = canvas.create_rectangle(0,0,50,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick2 = canvas.create_rectangle(50,0,100,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick3 = canvas.create_rectangle(100,0,150,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick4 = canvas.create_rectangle(150,0,200,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick5 = canvas.create_rectangle(200,0,250,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick6 = canvas.create_rectangle(250,0,300,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick7 = canvas.create_rectangle(300,0,350,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick8 = canvas.create_rectangle(350,0,400,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick9 = canvas.create_rectangle(400,0,450,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick10 = canvas.create_rectangle(450,0,500,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.bricksId = [self.brick1,self.brick2,self.brick3,self.brick4,self.brick5,self.brick6,self.brick7,self.brick8,self.brick9,self.brick10]

然后我想在这里引用 bricksId[0] 的ID:

self.hit_brick(pos,self.bricks.bricksId[0])

之前在 __init__ 方法里,我把砖块定义为 bricks,而 bricks 是通过 Brick(canvas) 创建的。但是,错误提示是:

TypeError: 'Brick' object does not support indexing

在其他相关问题的答案中,我找不到任何能帮我访问 bricks.bricksId[0] 的方法。

1 个回答

45

为了让Brick对象可以用下标访问,你需要实现以下几个方法:

  • __getitem__:这个方法让你可以通过下标获取对象里的数据。
  • __setitem__:这个方法让你可以通过下标给对象里的数据赋值。
  • __delitem__:这个方法让你可以通过下标删除对象里的数据。

你不需要实现所有的方法,只需要实现你实际用到的那些。

不过,这里似乎出现了一个问题,就是self.bricks被当成了一个单独的砖块,而不是一堆砖块的列表。一个砖块的列表是可以用下标访问的,但如果你不实现上面提到的方法,单独的砖块就不能用下标访问。

你可以查看这个链接来获取更多信息。


为了能在需要的时候调用self.bricks.bricksId[number]

def __getitem__(self,index):
    return self.bricks.bricksId[index]

def __setitem__(self,index,value):
    self.bricks.bricksId[index] = value

撰写回答