属性错误:'str'对象没有'attack'属性 "'帮帮我!

-1 投票
2 回答
4501 浏览
提问于 2025-04-16 08:33

我有一个关于属性错误的小问题,这是我为我的编程入门课写的一个基本的竞技场战斗者程序。以下是我在运行程序时遇到问题的代码片段:

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 个回答

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' 对象,也就是字符串),以及我们试图获取的是什么(一个名为 attack 的属性)。

接下来,我们看看出错的那一行。我们在哪里试图从某个东西上获取名为 attack 的属性?显然,就是我们写的 player.attack 这部分。所以现在我们知道发生了什么:我们的代码试图从 player 变量中获取 attack 属性,但 player 实际上指的是一个字符串,而字符串是没有 attack 属性的。(这很明显;比如 "hi mom"attack 是什么呢?这根本没有意义。)

那这是怎么发生的呢?好吧,如果我们写了代码试图读取 attack 属性,显然我们是期望它存在的。我们并不期望字符串上有这样的属性,所以错误在于我们把一个字符串放进了 player,而我们本来是期待其他东西的。

那这个值是怎么进入 player 的呢?它是一个函数的参数。因此,我们调用它时出错了,我们需要找到调用它的那行代码(提示:查看堆栈跟踪中的上一条记录),并修正周围的代码。我们本该传递什么呢?显然是某个有 attack 属性的东西。你有没有什么样的 Player 类?那么你应该传递这个类的一个实例,而不是一个(玩家的?)名字或其他东西。

4

显然,你在创建这个类的时候,调用了它的构造函数,但传入的是玩家的名字(字符串),而不是一个玩家对象(包含'攻击'、'防御'等参数)。

撰写回答