属性错误:'str'对象没有'attack'属性 "'帮帮我!
我有一个关于属性错误的小问题,这是我为我的编程入门课写的一个基本的竞技场战斗者程序。以下是我在运行程序时遇到问题的代码片段:
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 个回答
如何阅读和理解错误信息,以便自己解决问题:
首先,我们来看看错误信息:
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 类?那么你应该传递这个类的一个实例,而不是一个(玩家的?)名字或其他东西。
显然,你在创建这个类的时候,调用了它的构造函数,但传入的是玩家的名字(字符串),而不是一个玩家对象(包含'攻击'、'防御'等参数)。