Python 属性错误:';str';对象没有属性';攻击'&引用';救命啊&引用;
我有一个关于基本竞技场战士属性错误的快速问题,我正在为我的编程入门课程写。 这是我在运行程序时遇到问题的代码块Python 属性错误:';str';对象没有属性';攻击'&引用';救命啊&引用;,python,attributes,typeerror,attributeerror,string,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.defens
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
哈哈,暂时忽略名称生成器,这是我稍后会尝试解决的一个想法。现在我遇到的问题是,当我在空闲状态下运行程序时,会出现以下错误:
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”错误案例都涉及列表。
提前谢谢你 显然,您是在用player name(字符串)而不是player对象(带有参数'attack'、'defence'等)调用此类的构造函数(在实例化它的地方)。如何读取和理解错误消息,以便您可以帮助自己: 首先,我们读到:
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
的属性?显然,这是我们编写的player.attack
部分。因此,我们现在知道发生了什么:我们的代码试图从player
变量中获取attack
属性,但是player
引用的是字符串,而字符串没有attack
属性。(很明显,“hi mom”
“hi mom”
”的攻击是什么?这毫无意义。)
这是怎么发生的?好吧,如果我们编写的代码试图读取攻击
属性,那么很明显我们一定期待它出现。我们不希望字符串上有这样的属性,因此错误在于我们在需要其他内容时将字符串放入了player
值是如何进入播放器的?它是函数的一个参数。因此,我们错误地调用了,我们开始查找调用它的代码行(提示:查看堆栈跟踪中的上一个条目),并修复周围的代码。我们应该通过什么?显然,某些东西确实受到了攻击。你上过什么球员课吗?那么你应该传递一个实例,而不是(玩家的?)名字或其他任何东西。谢谢你,Max!那么,如果你能这么友善的话,我该如何着手解决这个问题呢:P正确的方向上的一点就足够了:)我不会因为怀疑这是正确的答案就投票——因为,正如作者所说,这是“显而易见的”。@Caleb W:从“而不是玩家对象”部分得到一个提示。谢谢Karl,这可能是我所看到的关于这个问题的最好的解释,非常清楚而且信息丰富!我已经解决了这个问题,现在一切正常!