Python游戏Mobs类调用wyvern方法报player_level属性不存在错误
报错原因
wyvern是Mobs类的实例方法,你直接使用类名Mobs.wyvern()调用,没有先创建类实例,触发调用时self指向缺失,自然不存在self.player_level属性。
- 你给
wyvern调用传入了player_level参数,但方法定义时没有设置形参接收该参数,传入的参数没有被实际使用。
- 你给
player_level属性仅在调用实例的__call__方法时才会被赋值,你既没有实例化Mobs类,也没有调用__call__方法传入等级,player_level属性从始至终没有被创建。
额外提示:原代码
__init__方法中self.type = type的写法有问题,type是Python内置关键字,会导致后续type属性赋值异常,建议修改为默认值None或者对应的类型字符串。
修复方案
这里提供两种符合你设计逻辑的修复方式:
方案1:调整wyvern为静态方法(最简便,符合直接调用创建怪物的需求)
直接让wyvern方法接收player_level参数,不需要依赖类实例属性,修改后的代码如下:
class Mobs(): def __init__(self): self.life = 10 self.atk = 2 self.arm = 1 self.name = villains.gen() self.playername = heroes.gen() self.type = None # 修正原内置关键字赋值问题 def __call__(self, player_level): self.player_level = player_level def attack(self, enemy): damage_amount = enemy.take_damage(self.atk) return damage_amount def take_damage(self, amount): damage_amount = (amount - self.arm) self.life -= damage_amount return damage_amount # 修改wyvern为静态方法 @staticmethod def wyvern(player_level): a_wyvern = Mobs() a_wyvern.type = "Wyvern" a_wyvern.life += player_level return a_wyvern
调用方式保持不变即可:
player_level = 20 a_wyvern = Mobs.wyvern(player_level)
方案2:保留__call__的设计逻辑
如果你需要保留通过__call__方法传递等级的设计,调整调用逻辑即可:
# 先给__init__添加player_level默认值,避免其他场景调用报错 def __init__(self): self.life = 10 self.atk = 2 self.arm = 1 self.name = villains.gen() self.playername = heroes.gen() self.type = None self.player_level = 0 # 添加默认初始值
调整调用逻辑:
player_level = 20 # 先实例化Mobs,调用__call__传入等级 mob_factory = Mobs() mob_factory(player_level) # 再调用实例的wyvern方法创建怪物 a_wyvern = mob_factory.wyvern()
内容的提问来源于stack exchange,提问作者CanisVY
相关产品推荐
相关产品推荐

