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

方法重写: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:57:27