AttributeError: объект ‘ str ‘ не имеет атрибута (метод)

Я пытаюсь написать шахматную партию, и получаю вышеуказанную ошибку при попытке переместить мою пешку. Мой первый вызов my_board[0][0].passive_move()работает отлично и правильно перемещает объект во второй список. Но если я вызову его снова немедленно, я получу ошибку в названии, вместо того, чтобы переместить объект в третий список.

__author__ = 'admin'

class Pawn:
    def __init__(self, y, x):
        self.board = my_board
        self.y = y
        self.x = x

    def __str__(self):
        return "Pawn"

    def passive_move(self):
        self.board[self.y+1][self.x] = self
        self.board[self.y][self.x] = chr(self.y+65)+str(self.x+1)
        self.y += 1

class ChessBoard:
    def __init__(self):
        self.board = self.create_board

    def create_board(self):
        game_board = []
        letters = ["A", "B", "C", "D", "E", "F", "G", "H"]
        for x in range(len(letters)):
            game_board.append([])
            for y in range(1, 9):
                game_board[x].append(str(letters[x])+str(y))

        return game_board

if __name__ == "__main__":
    my_board = ChessBoard().create_board()

    for x in range(len(my_board)):
        my_board[0][x] = Pawn(0, x)


    my_board[0][0].passive_move()
    my_board[0][0].passive_move()


    print(my_board)

1 ответ

  1. Проблема в том, что вы звоните passive_moveдважды по одним и тем же координатам платы:

    my_board[0][0].passive_move()
    my_board[0][0].passive_move()
    

    После первого вызова пешка, которая изначально была на этом квадрате, переместится на один, и поэтому квадрат будет содержать строку, а не Pawnэкземпляр. Так как строки не имеют passive_moveметода, вы получаете ошибку от второго вызова.

    Обратите внимание, что если вы индексировали только boardодин раз и сохранили ссылку Pawnна полученный экземпляр, вы можете сказать, чтобы он перемещался дважды. Попробуйте что-то вроде этого:

    pawn = my_board[0][0]
    pawn.passive_move()
    pawn.passive_move()