AttributeError: у объекта 'str' нет атрибута 'attack' '' Help! ' - PullRequest
0 голосов
/ 15 декабря 2010

У меня q быстрый вопрос, касающийся ошибки атрибута, касающейся основного бойца Arena, который я пишу для вступления в урок программирования.Вот фрагмент кода, с которым у меня возникают проблемы при запуске программы:

class Enemy:
    def __init__(self,player,weapons,armor):

        self.name = "Bad Guy" 
        self.health = 100
        self.attackPower = (player.attack + randint(-5,5))
        self.defensePower = (player.defense + randint(-5,5))
        self.weapon = player.weapon
        self.armor = player.armor
    def name_generator(self):
        import random
        element = ["Thunder","Lightning","Wind","Fire", "Stone"]
        tool = ["Hammer","Drill","Cutter","Knife", "Saw"]
        randomNumber1 = random.randrange(0,len(element))
        randomNumber2 = random.randrange(0,len(tool))
        self.randomname = element[randomNumber1] + " " + tool[randomNumber2]
        return self.randomname

Lol, пока игнорируйте Генератор имен, это идея, которую я постараюсь реализовать позже.Текущая проблема, с которой я сейчас сталкиваюсь, заключается в том, что когда я запускаю программу через IDLE, я получаю следующую ошибку:

  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'

Любая справка будет оценена по ошибке программы, так как я провел исследование и попытался найтиответ, но все остальные случаи ошибки 'str' включали списки.Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 15 декабря 2010

Очевидно, что вы вызываете конструктор этого класса (где вы его создаете) с именем игрока (строкой) вместо объекта игрока (с параметрами 'attack', 'defense' и т. Д.).

2 голосов
/ 15 декабря 2010

Как читать и понимать сообщения об ошибках, чтобы вы могли помочь себе:

Сначала читаем:

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? Тогда вы должны передать экземпляр этого, а не (имя игрока?) Или что-то еще.

...