В настоящее время я изучаю Python и пытался реализовать шахматы. (Я уже сделал это на разных языках)

class Board:

    def __init__(self):
        self._reset()

    def _reset(self, func=Board.default_layout):
        self.values = [[0 for x in range(8)] for i in range(8)]
        self.currentPlayer = 1
        func(self.values)

    @staticmethod
    def default_layout(values):
        pass


if __name__ == "__main__":
    b = Board()

Идея метода сброса состоит в том, чтобы сбросить плату. Кусочки на нем будут удалены, и будет вызвана функция, которая помещает фигуры на доску в первоначальном макете.

Существуют шахматные версии, где есть разные стартовые макеты. Поэтому я хотел сделать его необязательным параметром с помощью метода по умолчанию: default_layout(self)

Однако этот код не компилируется, и я хотел бы знать, где моя проблема.

Я получаю сообщение об ошибке:

NameError: name 'default_layout' is not defined 
-1
Finn Eggers 20 Сен 2018 в 10:31

2 ответа

Лучший ответ

Ваш def _reset(self, func=Board.default_layout): оценивается как часть определения Board, поэтому Board.default_layout еще не определен.

Вы можете сделать default_layout обычной функцией вместо статического метода. Это должно быть определено, прежде чем использовать его.

def default_layout(values):
    ... whatever

class Board:
    ...
    def _reset(self, func=default_layout):
        ...

Или, если должен быть статическим методом, не пытайтесь ссылаться на него внутри объявления функции. Вы можете ссылаться на него внутри функции body , потому что тело не выполняется до тех пор, пока функция не будет вызвана.

    def _reset(self, func=None):
        if func is None:
            func = Board.default_layout
2
khelwood 20 Сен 2018 в 07:41

В качестве альтернативы ответу @ khelwood вы также можете использовать функцию lambda, если предпочитаете сохранять default_layout статическим методом класса Board.

Изменить:

def _reset(self, func=Board.default_layout):

Кому

def _reset(self, func=lambda values: Board.default_layout(values)):
1
blhsing 20 Сен 2018 в 07:42