Python AttributeError:非类型对象没有属性“health”
在我的战略游戏《桌上战争》中的一场漫长的比赛中,我遇到了这个错误。每当战场上有许多单位时,这种情况就会发生。以下是回溯:Python AttributeError:非类型对象没有属性“health”,python,debugging,pygame,Python,Debugging,Pygame,在我的战略游戏《桌上战争》中的一场漫长的比赛中,我遇到了这个错误。每当战场上有许多单位时,这种情况就会发生。以下是回溯: Traceback (most recent call last): File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 727, in <module> main() File "C:\Users\Oventoaster\Desktop\Games\Ta
Traceback (most recent call last):
File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 727, in <module>
main()
File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 131, in main
RedTeam.update()
File "C:\Python27\lib\site-packages\pygame\sprite.py", line 399, in update
for s in self.sprites(): s.update(*args)
File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 372, in update
self.attack()
File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 393, in attack
self.target.health -= self.attack_damage
AttributeError: 'NoneType' object has no attribute 'health'
例外情况似乎出现在目标代码和攻击代码中,因此我将在此处发布它们:
def move_toward(self, target):
if self.target is None:
self.rect.move_ip(1, 0)
def update(self):
self.find_target()
self.move_toward(self.target)
self.attack()
if self.health <= 0:
self.kill()
def find_target(self):
if self.target is not None: return
for enemy in BluTeam.sprites():
if enemy.rect.centerx - self.rect.centerx <= self.range and enemy.rect.centery - self.rect.centery <= self.range:
self.target = enemy
return
self.target = None
def attack(self):
global REDGOLD
global BLUECOMMAND
if self.target is None: return
if self.target.health <= 0:
REDGOLD += self.target.reward
BLUECOMMAND += self.target.cmdback
self.target = None
if not self.cooldown_ready(): return
self.target.health -= self.attack_damage
def cooldown_ready(self):
now = pygame.time.get_ticks()
if now - self.attack_last >= self.attack_cooldown:
self.attack_last = now
return True
return False
如何修复此问题?常见错误的解释或如何更好地理解调试程序的简单回溯: 友好的解释器给出导致错误的语句。这很重要,因为这意味着引发的错误与这行代码有关
AttributeError: 'NoneType' object has no attribute 'health'
我们到了。误差为;文档对此非常清楚:我试图读取的值,或者我试图分配给一个不是相关对象成员的变量
我的目标是什么?它是一个“非类型”对象;我们没有名字,但有它的类型。我们遇到问题的对象是NoneType,因此它是特殊对象None
这个对象有什么错误?它没有“健康”属性,只是表示回溯。因此,我们在错误引发的代码行的某个地方访问属性health,这是对None对象调用的
现在我们几乎都设置好了:self.target.health是错误行中我们使用health的唯一位置,因此它意味着self.target没有。现在我看一下源代码,我试图理解为什么会这样,即使我在函数的开头对它进行了检查。这导致了这样一个事实:在那一行之后,我必须以某种方式将其设置为“无”
所有这些推理步骤都会得出一个简短的答案:
这意味着自我目标是没有的。错误来自您的代码:
if self.target.health <= 0:
REDGOLD += self.target.reward
BLUECOMMAND += self.target.cmdback
self.target = None # set to None
if not self.cooldown_ready(): return
self.target.health -= self.attack_damage # self.target is None, .health failed
+1.我从来没有看到有人在这里花时间详细解释追溯。干得好,希望这对作品有所帮助。啊,那么你是说我应该把伤害线放在我的杀戮块前面吗?@Oventoaster我想是的,否则你会有一个僵尸和不死生物即使被杀也会移动的游戏。重要的是要理解如何使用调试信息None object(不应该是None)返回到您的算法设计问题,在破坏之前检查死亡
AttributeError: 'NoneType' object has no attribute 'health'
if self.target.health <= 0:
REDGOLD += self.target.reward
BLUECOMMAND += self.target.cmdback
self.target = None # set to None
if not self.cooldown_ready(): return
self.target.health -= self.attack_damage # self.target is None, .health failed