Python文本RPG:Player对象无loot属性的报错解决与属性添加求助
解决AttributeError: 'Player' object has no attribute 'loot'问题
嘿,这个问题其实很好搞定——你的Player类确实没定义loot属性,但LootTile里的代码却在尝试读写它,所以才抛出了这个错误。咱们一步步来修复:
第一步:给Player类添加loot属性
打开你的player.py,在Player的__init__方法里,新增一行初始化loot的代码。因为你要存储多个战利品,把它初始化为空列表是最合适的选择:
class Player: def __init__(self): self.inventory = [items.Dagger(), items.BreadRoll(), items.Potion()] self.x = world.start_tile_location[0] self.y = world.start_tile_location[1] self.hp = 100 self.gold = 100 self.victory = False self.loot = [] # 新增:初始化loot为空列表
第二步:修复LootTile里的两处细节
打开world.py的LootTile类,这里有两个地方需要调整:
- 调用父类初始化方法:
LootTile继承自MapTile,必须在__init__里先调用super().__init__(x, y),确保父类的位置属性等被正确初始化,避免后续出现其他奇怪问题。 - 创建战利品实例:把
self.loot = items.FancyChocolate改成self.loot = items.FancyChocolate()——你之前引用的是物品类本身,不是具体的战利品实例,加括号才能生成一个可被拾取的物品对象。 - 正确添加战利品:因为
loot是列表,用append()方法添加元素比用+更直观(当然用player.loot += [self.loot]也能达到相同效果)。
修改后的LootTile代码:
class LootTile(MapTile): def __init__(self, x, y): super().__init__(x, y) # 新增:调用父类初始化 self.loot = items.FancyChocolate() # 改为创建物品实例 self.loot_claimed = False def modify_player(self, player): if not self.loot_claimed: self.loot_claimed = True player.loot.append(self.loot) # 用append添加到loot列表 print("You've retrieved a Fancy Chocolate!")
这样修改后,当玩家走到LootTile时,就能正常把巧克力添加到自己的loot列表里,再也不会报那个属性错误啦!
内容的提问来源于stack exchange,提问作者donnieth65
相关产品推荐
相关产品推荐

