You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python游戏Mobs类调用wyvern方法报player_level属性不存在错误

报错原因
    1. wyvern是Mobs类的实例方法,你直接使用类名Mobs.wyvern()调用,没有先创建类实例,触发调用时self指向缺失,自然不存在self.player_level属性。
    1. 你给wyvern调用传入了player_level参数,但方法定义时没有设置形参接收该参数,传入的参数没有被实际使用。
    1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 01:06:09