【问题标题】:AttributeError: 'NoneType' object has no attribute 'foo'AttributeError:“NoneType”对象没有属性“foo”
【发布时间】:2017-11-01 22:59:33
【问题描述】:

我收到此错误:

[...], line 28, in <module>
    PlayerDamage = Dice * int(set_p_w.player_damage)
AttributeError: 'NoneType' object has no attribute 'player_damage'

当我运行这段代码时:

import player
Dice = random.randrange(1, 7)
set_p_w = player.set_player_weapon()
PlayerDamage = Dice * set_p_w.player_damage

这就是player.set_player_weapon() 的样子:

def set_player_weapon():
    import items
    player_weapon = items.WBrokenSword
    player_damage = player_weapon.damage

我到处搜索并尝试了许多不同的解决方案,但没有任何帮助。我的代码有什么问题?

【问题讨论】:

  • set_player_weapon() 返回什么值?
  • 您有关于player 模块如何工作的文档吗?
  • return set_player_weapon() [Previous line repeated 995 more times] RecursionError: maximum recursion depth exceeded
  • 你是什么意思,@FabianYing?

标签: python python-3.x attributeerror nonetype


【解决方案1】:

根据您发布的代码,player.set_player_weapon() 不会返回任何内容。所以set_p_w 什么都不是。您正在与set_p_w 进行交互,就好像它是一个对象一样,但set_player_weapon() 不会创建对象,它只是设置两个局部变量(player_weaponplayer_damage),然后在函数结束时丢弃它们。

最简单的方法是让您的player.set_player_weapon() 方法返回一个包含该信息的元组,以便将其存储在函数外部的变量中:(player_weapon, player_damage)

元组方法

def set_player_weapon():
    import items
    player_weapon = items.WBrokenSword
    player_damage = player_weapon.damage
    return (player_weapon, player_damage)

player_weapon_damage = player.set_player_weapon()
PlayerDamage = Dice * player_weapon_damage[0]

更好的方法是为Player 创建一个类,该类具有player_weaponplayer_damage 属性以及设置和更改其属性的def set_player_weapon() 等方法。

【讨论】:

  • 我这样做了:def set_player_weapon(): import items player_weapon = items.WBrokenSword player_damage = player_weapon.damage return player_weapon, player_damage,结果是:AttributeError: 'tuple' object has no attribute 'player_damage'
  • 只有对象具有可以用点符号访问的属性。您可以通过将元组解包到变量中来访问元组中的数据:weapon, damage = set_p_w 或使用括号表示法:player_damage = set_p_w[0]
猜你喜欢
  • 1970-01-01
  • 2019-01-01
  • 2021-12-26
  • 2019-07-23
  • 2018-05-13
  • 2020-09-07
  • 2017-05-03
  • 2023-03-16
  • 2018-07-14
相关资源
最近更新 更多