Python多继承HoverCraft类报错:SeaVessel.__init__参数缺失
多重继承初始化报错:SeaVessel.__init__缺少必要参数
在完成学校实验时,我实现了同时继承LandVehicle和SeaVessel的HoverCraft类,但实例化该类时触发TypeError,提示SeaVessel.__init__缺少displacement和launch两个必要参数,尝试使用super()方法仍未解决问题。
完整代码
class Vehicle: def __init__(self,name,maxPassengers,maxSpeed): self.name=name self.maxPassengers=maxPassengers self.maxSpeed=maxSpeed def display(self): print('Ten phuong tien:',self.name) print('So hanh khach toi da:',self.maxPassengers) print('Toc do toi da:',self.maxSpeed) class LandVehicle(Vehicle): def __init__(self,name,maxPassengers,maxSpeed,numWheels,drive): super().__init__(name,maxPassengers,maxSpeed) self.numWheels=numWheels self.drive=drive def display(self): print('\nTen phuong tien:',self.name) print('So hanh khach toi da:',self.maxPassengers) print('Toc do toi da:',self.maxSpeed) print('Banh xe:',self.numWheels) print('Ghe lai:',self.drive) class SeaVessel(Vehicle): def __init__(self,name,maxPassengers,maxSpeed,displacement,launch): super().__init__(name,maxPassengers,maxSpeed) self.displacemant=displacement # 注意:此处属性名拼写错误,应为displacement self.launch=launch def display(self): print('\nTen phuong tien:',self.name) print('So hanh khach toi da:',self.maxPassengers) print('Toc do toi da:',self.maxSpeed) print('Trong luong:',self.displacemant) print('Xuat diem:',self.launch) class HoverCraft(LandVehicle,SeaVessel): # 核心问题类 def __init__(self, name, maxPassengers, maxSpeed, numWheels, drive,displacement,launch,enterLand,enterSea): LandVehicle.__init__(self,name,maxPassengers,maxSpeed,numWheels,drive) SeaVessel.__init__(self,name,maxPassengers,maxSpeed,displacement,launch) self.enterLand=enterLand self.enterSea=enterSea def display(self): super().display() print('Banh xe:',self.numWheels) print('Ghe lai:',self.drive) print('Trong luong:',self.displacemant) print('Xuat diem:',self.launch) print('Vao dat:',self.enterLand) print('Vao bien:',self.enterSea) v=Vehicle('xe',4,'40km/h') v1=LandVehicle('xe tai',2,'60km/h',4,1) v3=SeaVessel('tau danh ca',50,'22knot',20,"3h") v5=HoverCraft('moto nuoc',2,'80km/h',0,1,10,'2h','6h','17h') v.display() v1.display() v3.display() v5.display()
错误栈
File "/home/runner/inheritance2/main.py", line 79, in <module> v5=HoverCraft('moto nuoc',2,'80km/h',0,1,10,'2h','6h','17h') File "/home/runner/inheritance2/main.py", line 61, in __init__ LandVehicle.__init__(self,name,maxPassengers,maxSpeed,numWheels,drive) File "/home/runner/inheritance2/main.py", line 13, in __init__ super().__init__(name,maxPassengers,maxSpeed) TypeError: SeaVessel.__init__() missing 2 required positional arguments: 'displacement' and 'launch'
问题原因与修复方案
问题根源
Python的**方法解析顺序(MRO)**导致了这个错误。HoverCraft的继承顺序是LandVehicle, SeaVessel,其MRO顺序为:HoverCraft → LandVehicle → SeaVessel → Vehicle → object。当调用LandVehicle.__init__里的super().__init__时,super()会指向MRO中的下一个类——也就是SeaVessel,而非预期的Vehicle。但SeaVessel的__init__需要displacement和launch两个额外参数,当前调用只传了3个参数,因此触发报错。
修复方案1:直接调用父类构造方法(适合简单场景)
把LandVehicle和SeaVessel中的super().__init__替换为直接调用Vehicle的构造方法,跳过MRO的链式调用:
class LandVehicle(Vehicle): def __init__(self,name,maxPassengers,maxSpeed,numWheels,drive): Vehicle.__init__(self,name,maxPassengers,maxSpeed) # 替换super()调用 self.numWheels=numWheels self.drive=drive class SeaVessel(Vehicle): def __init__(self,name,maxPassengers,maxSpeed,displacement,launch): Vehicle.__init__(self,name,maxPassengers,maxSpeed) # 替换super()调用 self.displacement=displacement # 同时修正拼写错误 self.launch=launch
修复方案2:遵循多重继承的super()规范(更专业)
给所有父类的__init__添加可变参数,让参数能在MRO链中正确传递:
- 修改
Vehicle的__init__:
class Vehicle: def __init__(self,name,maxPassengers,maxSpeed, *args, **kwargs): self.name=name self.maxPassengers=maxPassengers self.maxSpeed=maxSpeed
- 修改
LandVehicle和SeaVessel的__init__,传递可变参数:
class LandVehicle(Vehicle): def __init__(self,name,maxPassengers,maxSpeed,numWheels,drive, *args, **kwargs): super().__init__(name,maxPassengers,maxSpeed, *args, **kwargs) self.numWheels=numWheels self.drive=drive class SeaVessel(Vehicle): def __init__(self,name,maxPassengers,maxSpeed,displacement,launch, *args, **kwargs): super().__init__(name,maxPassengers,maxSpeed, *args, **kwargs) self.displacement=displacement # 修正拼写错误 self.launch=launch
- 修改
HoverCraft的__init__,用super()初始化:
class HoverCraft(LandVehicle,SeaVessel): def __init__(self, name, maxPassengers, maxSpeed, numWheels, drive,displacement,launch,enterLand,enterSea): super().__init__(name, maxPassengers, maxSpeed, numWheels, drive, displacement, launch) self.enterLand=enterLand self.enterSea=enterSea
额外修正
注意SeaVessel中属性名拼写错误:self.displacemant应改为self.displacement,否则display方法会无法正确读取该属性。
内容的提问来源于stack exchange,提问作者Hoang Anh Vu
相关产品推荐
相关产品推荐

