Python OOP继承问题:Player对象无print_mana属性报错怎么解决?
问题解决:Python子类继承父类属性/方法的错误修复
你的代码出现两个核心问题导致报错:
- 子类
Player重写了__init__方法,但未调用父类setting_mana的构造方法,导致父类的print_mana属性从未被初始化 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
相关产品推荐
相关产品推荐

