我在策略游戏Table Wars中的长时间比赛中遇到此错误。只要战场上有很多单位,似乎就会发生这种情况。这是追溯:
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
我该如何解决这个问题?
答案 0 :(得分:8)
常见错误的说明或如何更好地理解调试程序的简单回溯:
File "<path>\<filename>.py", line 393, in <function>
Traceback为您提供callstack并指出错误在哪个函数中引发。 Nothin特别在这里
self.target.health -= self.attack_damage
友好的解释器给出导致错误的声明。这很重要,因为它意味着引发的错误与这行代码有关。
AttributeError: 'NoneType' object has no attribute 'health'
我们在这里。错误是AttributeError
;文档非常清楚:我正在尝试读取或者我正在尝试分配给不是相关对象成员的变量。
我的目标是什么?这是'NoneType' object
;我们没有这个名字,但我们有它的类型。我们遇到问题的对象是NoneType
,因此它是特殊对象None
。
此None
对象的错误是什么?它没有'health'
属性表示Traceback。因此,我们在错误引发的代码行中的某处访问属性health
,并在None
对象上调用它。
现在我们几乎全部设置:self.target.health
是我们使用health
的错误行中的唯一位置,因此它表示self.target
为None
。现在我看一下源代码,我试着理解它为什么会这样,即使我在函数的开头对它进行检查。这导致我必须在该行之后以某种方式将其设置为None
。
所有这些推理步骤都会导致简短的回答:
这意味着self.target
是None
。错误来自您的代码:
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