Python不修改原有类继承两个类时__init__参数缺失报错怎么解决
错误原因
你的报错是Python多继承的MRO(方法解析顺序)规则导致的:ScientificSwimmer的继承链优先级为ScientificSwimmer > Scientist > Swimmer > Human,当你调用Scientist.__init__时,其内部的super().__init__(name, age)实际会调用顺序中下一个类Swimmer的构造方法,而Swimmer.__init__要求传入hours参数,你没有传递,就触发了缺少位置参数的TypeError。
解决方案
在不修改Human/Scientist/Swimmer三个上层父类的前提下,我们只需要修改ScientificSwimmer的构造逻辑,手动完成所有属性初始化,绕过父类构造的super调用冲突即可:
- 直接调用顶层父类
Human的构造初始化name、age属性 - 手动给实例赋值
Scientist需要的lab属性、Swimmer需要的hours属性 - 去掉实例化时
name参数前多余的换行符\n,避免输出前出现空行
修正后完整代码
class Human: def __init__(self, name, age): self.name = name self.age = age def hobby(self): print("Likes watching Netflix") def info(self): print(self.name , "is ",self.age," years old") class Scientist(Human): def __init__(self, name, age, lab): super().__init__(name, age) self.lab = lab def hobby(self): print("Likes doing scientific experiments") def labName(self,lab): print("works at the " ,lab, "laboratory") class Swimmer(Human): def __init__(self, name, age, hours): super().__init__(name,age) self.hours = hours def hobby(self): print("likes swimmming in the lake" ) def hoursSwimming(self, hours): print("swims ", hours , "hours per week") class ScientificSwimmer(Scientist, Swimmer): def __init__ (self, name, age, lab, hours): # 直接调用顶层父类初始化公共属性 Human.__init__(self, name, age) # 手动赋值两个父类各自需要的属性 self.lab = lab self.hours = hours scienswim = ScientificSwimmer("John Smith", 30, "nuclear", 100) scienswim.info() scienswim.hobby() scienswim.labName("nuclear") scienswim.hoursSwimming(100)
运行输出
John Smith is 30 years old Likes doing scientific experiments works at the nuclear laboratory swims 100 hours per week
注:输出和你期望的格式差异仅为原有父类定义的字符串首字母大小写、空格差异,无需修改父类即可满足核心逻辑要求。
内容的提问来源于stack exchange,提问作者Orianna Sanele
相关产品推荐
相关产品推荐

