方法重写:Super().<方法> 与 Class().<方法> 的调用差异解析
为什么子类中调用
Vehicle().fare()无效,而super().fare()可以正常运行? 直接报错的原因:Vehicle()调用缺少必要参数
你代码里的Vehicle().fare()会直接触发错误——Vehicle类的__init__方法要求传入name、mileage、capacity三个参数,但你调用Vehicle()时没传任何参数,运行时会抛出TypeError: __init__() missing 3 required positional arguments: 'name', 'mileage', and 'capacity',这是代码无法生效的直接原因。
就算补全参数,这种写法也不合理
假设你改成Vehicle(self.name, self.mileage, self.capacity).fare(),虽然不会报错,但这是创建了一个全新的Vehicle对象,完全没必要——你的Bus实例本身已经继承了父类的属性,不需要额外新建父类对象来计算票价,既浪费资源,也违背了继承的设计逻辑。
super().fare()的正确逻辑
super()会返回一个指向父类的代理对象,调用super().fare()时,本质是让父类的fare方法复用当前Bus实例的self。也就是说,父类fare里的self.capacity,用的是你创建的School_bus实例的capacity=50,计算出基础票价50*100=5000,再加10%额外费用后得到5500,这才是你需要的结果。
两种正确写法对比
推荐写法(用super(),符合继承设计)
class Vehicle: def __init__(self, name, mileage, capacity): self.name = name self.mileage = mileage self.capacity = capacity def fare(self): return self.capacity * 100 class Bus(Vehicle): def fare(self): base_fare = super().fare() return int(base_fare + base_fare * 0.1) School_bus = Bus("School Volvo", 12, 50) print("Total Bus fare is:", School_bus.fare()) # 输出:Total Bus fare is: 5500
不推荐但可行的写法(直接传self给父类方法)
如果不想用super(),也可以直接调用父类方法并传入当前实例的self,避免新建对象:
class Bus(Vehicle): def fare(self): base_fare = Vehicle.fare(self) return int(base_fare + base_fare * 0.1)
内容的提问来源于stack exchange,提问作者AmirHossein Rd
相关产品推荐
相关产品推荐

