web-dev-qa-db-fra.com

Python: l'objet ne prend pas en charge l'indexation

Oui, cette question a déjà été posée. Non, aucune des réponses que j'ai lues n'a pu résoudre le problème que j'ai.

J'essaie de créer un petit jeu Bounce. J'ai créé les briques comme ceci:

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]

Et j'essaie de référencer l'ID de bricksId[0] Ici:

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

Plus tôt, dans le __init__, Je définis les briques comme des briques, ce qui est défini comme Brick(canvas). Cependant, l'erreur indique:

TypeError: 'Brick' object does not support indexing

Dans les réponses aux autres questions de ce sujet, je ne trouve aucun qui m'aide à accéder à bricks.bricksId[0].

15
Jonathan Spirit

Pour que l'objet Brick soit indexable, vous devez implémenter les méthodes:

  • __getitem__
  • __setitem__
  • __delitem__

Vous n'avez pas besoin de tous, seulement ceux que vous utilisez.

Cependant, cela ressemble à un cas de self.bricks étant une brique au lieu d'une liste de briques. Une liste de briques est indexable; cependant, une brique n'est pas elle-même à moins que vous n'implémentiez les méthodes ci-dessus.

Vérifiez ceci pour référence.


Pour pouvoir appeler self.bricks.bricksId[number] quand j'avais besoin:

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

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