Как читать и понимать сообщения об ошибках, чтобы вы могли помочь себе:
Сначала читаем:
File "C:\Users\Caleb Walter\Downloads\Arena_Battler.py", line 150, in __init__
self.attackPower = int(player.attack + randint(-5,5))
AttributeError: 'str' object has no attribute 'attack'
В первой строке указано, в каком файле и в какой строке мы находились, когда возникла проблема. Вторая строка - это копия строки, вызывающей проблему, поэтому мы можем посмотреть на нее, не возвращаясь и не просматривая ее. Последняя строка - это описание проблемы.
Следовательно, следующий шаг - прочитать, в чем заключалась проблема. AttributeError
означает, что мы пытались получить атрибут от чего-то, у кого его нет. Остальное говорит о том, из каких вещей мы пытались его получить ('str' object
, то есть строка), и что мы пытались получить (атрибут с именем attack
).
Далее мы смотрим на обсуждаемую строку. Где мы пытаемся получить атрибут с именем attack
из чего-то? Очевидно, это та часть, где мы написали player.attack
. Таким образом, теперь мы знаем, что произошло: наш код пытается получить атрибут attack
из переменной player
, но player
ссылается на строку, а строки не имеют атрибута attack
. (Очевидно, что такое attack
из "hi mom"
? Это не имеет никакого смысла.)
Как это случилось? Что ж, если мы написали код, который пытается прочитать атрибут attack
, очевидно, мы должны были ожидать его появления. Мы не ожидаем такого атрибута в строках, поэтому ошибка в том, что мы поместили строку в player
, когда ожидали чего-то другого.
Как значение попадает в player
? Это параметр функции. Поэтому мы неправильно назвали и пошли искать строку кода, в которой мы ее вызвали (подсказка: посмотрите на предыдущую запись в трассировке стека ), и исправили окружающий код. Что мы должны были пройти? Ну, то, что имеет attack
, очевидно. Был ли у вас какой-нибудь класс Player? Тогда вы должны передать экземпляр этого, а не (имя игрока?) Или что-то еще.