AttributeError:'str'对象没有属性'attack'“'帮助!”

时间:2010-12-15 08:14:33

标签: python attributes typeerror attributeerror string

我有一个关于我正在为我的编程类简介写的基本竞技场战斗机的属性错误的快速问题。 以下是我在运行程序时遇到问题的代码块,

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

大声笑,暂时忽略名称生成器,这是一个想法,我试着稍后解决。我现在遇到的当前问题是,当我通过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 个答案:

答案 0 :(得分:4)

显然,您正在使用播放器名称(字符串)而不是播放器对象(带有参数'attack','defense'等)来调用此类的构造函数(在其中实例化它)。

答案 1 :(得分:2)

如何阅读和理解错误消息,以便您可以自助:

首先,我们读到它:

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 1}}属性。 (显然; attack的{​​{1}}是什么?这没有任何意义。)

这是怎么发生的?好吧,如果我们编写的代码试图读取"hi mom"属性,显然我们一定期待它存在。我们不期望字符串有这样的属性,所以错误是我们在预期其他内容时将字符串放入attack

价值如何进入player?它是函数的参数。因此,我们错误地调用,然后我们去查找我们调用它的代码行(提示:查看堆栈跟踪中的上一个条目),并修复周围的代码。我们应该通过什么?那么,显然有player的东西。你有某种类的Player类吗?那么你应该传递一个实例,而不是(玩家的?)名称或其他什么。