-1

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

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”错误都涉及列表。先感谢您!

4

2 回答 2

4

显然,您使用播放器名称(字符串)而不是播放器对象(带有参数“攻击”、“防御”等)调用此类(实例化它的位置)的构造函数。

于 2010-12-15T08:18:29.947 回答
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意味着我们试图从没有它的东西中获取属性。其余部分说明我们试图从什么类型的东西(a 'str' object,即一个字符串)中获取它,以及我们试图得到什么(一个名为 的属性attack)。

接下来我们看看有问题的行。我们在哪里尝试attack从某个东西中获取一个命名的属性?显然,这是我们编写的部分player.attack。因此,我们现在知道发生了什么:我们的代码试图从变量中获取attack属性,但引用的是字符串,而字符串没有属性。(显然;of是什么?这没有任何意义。)playerplayerattackattack"hi mom"

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

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

于 2010-12-15T10:38:03.233 回答