
本文详解在子类中重写父类方法时,如何合理设置默认参数值,避免重复赋值错误,并说明 super() 的正确用法及参数传递逻辑。
本文详解在子类中重写父类方法时,如何合理设置默认参数值,避免重复赋值错误,并说明 super() 的正确用法及参数传递逻辑。
在 Python 面向对象编程中,当子类需要扩展或定制父类方法的行为(例如为某参数提供默认值),常通过方法重写(override)实现。本例的核心目标是:让 Bus 类的 seating_capacity() 方法在不传参时自动使用 50 作为座位容量,同时复用 Vehicle 类中已定义的格式化逻辑。
关键在于理解两个层次的职责分离:
-
声明层(函数定义):通过
capacity=50为参数设置默认值,使该方法可被无参调用(如bus.seating_capacity()); -
调用层(函数执行):使用
super().seating_capacity(capacity)将当前计算出的capacity值(无论是默认值还是用户传入值)透传给父类方法,而非硬编码为50。
因此,原始答案中的写法:
def seating_capacity(self, capacity=50):
return super().seating_capacity(capacity=50) # ❌ 错误:忽略调用时传入的实际参数存在严重缺陷:它强制将父类方法的 capacity 固定为 50,导致 School_bus.seating_capacity(45) 仍输出 50 —— 完全丧失了参数灵活性。
立即学习“Python免费学习笔记(深入)”;
✅ 正确写法应为:
class Bus(Vehicle):
def seating_capacity(self, capacity=50):
return super().seating_capacity(capacity) # ✅ 透传,支持默认值与自定义值
# 测试验证
School_bus = Bus("School Volvo", 180, 12)
print(School_bus.seating_capacity()) # 输出:The seating capacity of a School Volvo is 50 passengers
print(School_bus.seating_capacity(45)) # 输出:The seating capacity of a School Volvo is 45 passengers⚠️ 注意事项:
-
super().seating_capacity(capacity)中的capacity是变量名引用,不是字面量;若写成capacity=50则变为关键字实参硬编码,违背了默认参数的设计初衷; - 此处重写虽改变了方法签名(从必填参数变为可选),但因父类方法逻辑纯粹(仅格式化),未破坏里氏替换原则(LSP);
- 若未来需对
Bus做特殊处理(如加收空调费提示),可在调用super()前后添加业务逻辑,保持扩展性。
总结:默认参数应在定义时声明,参数值应在调用时传递;super() 不是装饰器,而是显式委托机制——正确使用它,才能兼顾复用性、灵活性与可维护性。


















