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

Python OOP继承问题:Player对象无print_mana属性报错怎么解决?

问题解决:Python子类继承父类属性/方法的错误修复

你的代码出现两个核心问题导致报错:

  1. 子类Player重写了__init__方法,但未调用父类setting_mana的构造方法,导致父类的print_mana属性从未被初始化
  2. print_mana是实例属性(数值类型),不是可调用的方法,不能用()执行

修复方案一:调用父类构造方法,保留原属性命名

修改Player类的__init__,添加对父类构造方法的调用,同时正确访问属性:

class setting_mana:
    def __init__(self, mana=30):
        self.print_mana = mana  # 这是数值属性,不是方法

class Player(setting_mana):
    def __init__(self, hit_points, sides, mana=30):
        # 调用父类构造方法,初始化父类属性
        super().__init__(mana)
        self.hit_points = hit_points
        self.sides = sides

    def take_hit(self):
        self.hit_points -= 2
        return self.hit_points

alexandre = Player(10,6)
print(alexandre.print_mana)  # 直接访问属性,无需加()

修复方案二:将print_mana改为方法(更符合命名逻辑)

如果你的本意是让父类提供打印 mana 的功能,建议把它定义为方法,避免属性与方法命名混淆:

class setting_mana:
    def __init__(self, mana=30):
        self.mana = mana  # 用清晰的名称存储属性

    def print_mana(self):  # 定义专门的打印方法
        print(f"当前 mana 值:{self.mana}")

class Player(setting_mana):
    def __init__(self, hit_points, sides, mana=30):
        super().__init__(mana)  # 初始化父类的mana属性
        self.hit_points = hit_points
        self.sides = sides

    def take_hit(self):
        self.hit_points -= 2
        return self.hit_points

alexandre = Player(10,6)
alexandre.print_mana()  # 现在可正常调用方法

关键注意点

  • 子类重写__init__时,必须显式调用父类的__init__(通过super().__init__()或setting_mana.__init__(self, ...)),否则父类的属性不会被初始化
  • 严格区分实例属性和方法:属性是存储的数据,直接访问;方法是可执行的函数,需要加()调用

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:24:30