Есть несколько быстрых и прямых способов, а затем есть способ переосмыслить дизайн и использование наследования.
Быстрый способ: заставить perform_move
в базовом классе принять *args
и **kwargs
аргументы; тогда наследующий класс также просто принимает *args
и **kwargs
, и все это будет работать. Мне это не очень нравится, потому что таким образом мы теряем сигнатуру функции, но это заставит Пилинта перестать жаловаться.
Более длинный путь: если GameState
не должен касаться очков игроков, то я Предположим, у него есть какая-то другая ответственность. Подклассы GameState
будут по-прежнему нести такую же ответственность; они просто выполняют это по-другому. Но теперь вы также возлагаете на него ответственность за подсчет и отслеживание очков игрока. По крайней мере, я предполагаю, что именно это и должна делать переопределенная версия perform_move
.
Так что, возможно, вам нужен отдельный класс ScoreKeeper
только для отслеживания оценки, и он не должен наследоваться от GameState
.
Тогда у вас будет класс, отвечающий за "обработку" ходов игрока. Этот класс будет взаимодействовать отдельно с GameState
, чтобы сообщить ему о позиции линии, и с ScoreKeeper
, чтобы сообщить об игроке.