Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Pouvez-vous m'expliquer comment fonctionne le "other" ?

0 votes
class Board:

  def __init__(self,other=None):
    self.player = 'X'
    self.opponent = 'O'
    self.empty = ' '
    self.size = 3
    self.fields = {}
    for y in range(self.size):
      for x in range(self.size):
        self.fields[x,y] = self.empty
    # copy constructor
    if other:
        self.__dict__ = deepcopy(other.__dict__)
demandé 19-Nov par anonyme
edité 19-Nov par max

1 Réponse

–1 vote

other est un paramètre de type Board
__dict__ est un dict qui contient les attributs de l'objet, exemple :

>>> b = Board()
>>> b_copy = Board(b)
>>> b.__dict__
{"player" : 'X', "opponent" : 'O', "empty : ' ', ", "size" : 3, "fields" : <flemme>}
b_copy.__dict__
{"player" : 'X', "opponent" : 'O', "empty : ' ', ", "size" : 3, "fields" : <flemme>}

deepcopy (fonction du module éponyme) permet de copier les listes intégralement sinon on a des effets de bord :

>>> lst = [40, 41, 42]
>>> lst_copy = lst
>>> lst_copy
[40, 41, 42]
>>> lst[0] = 42 # modification de lst
>>> lst
[42, 41, 42]
>>> lst_copy
[42, 41, 42] # modifie également lst_copy

Sinon n'utilise pas pas dict, c'est dangereux, on peut se retrouver avec deux objets d'une même classe avec des attributs différents et donc des méthodes qui ne fonctionnent pas
À la place fait :

def __init__(self, other):
  self = other

Tu peux aussi faire comme dans ton post : self.dict = deepcopy.deepcopy(other.dict) mais en vérifiant isinstance(other, Board)

edit : Merci Yoch pour la remarque (return dans init:D), ce que je dit sur dict n'est valable que dans certains cas (obj.__dict__ = json.load(file) par exemple)

répondu 20-Nov par Magikh42 (108 points)
edité 23-Nov par Magikh42

C'est n'importe quoi le conseil que tu donnes à la fin. Une fonction __init__ ne doit pas faire de return, et ton commentaire n'a aucun sens (mis à part le fait qu'il commence par //).

...