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

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链中正确传递:

  1. 修改Vehicle的__init__:
class Vehicle:
  def __init__(self,name,maxPassengers,maxSpeed, *args, **kwargs):
    self.name=name
    self.maxPassengers=maxPassengers
    self.maxSpeed=maxSpeed
  1. 修改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
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:32:38