在面向对象编程中,可通过在子类中重写父类方法并添加默认参数来实现灵活的默认值设定,关键在于正确调用super()并传递动态参数,而非硬编码值。
在 Python 的继承体系中,为子类方法设置默认参数(如 capacity=50)是一种常见且实用的设计模式,但其实现必须兼顾复用性与灵活性。核心原则是:子类负责定义接口契约(含默认值),父类专注实现逻辑;子类应将实际传入的参数(包括默认值)完整、动态地转发给父类,而非在 super() 调用中固化参数值。
以下是一个典型且正确的实现示例:
class Vehicle:
def __init__(self, name, max_speed, mileage):
self.name = name
self.max_speed = max_speed
self.mileage = mileage
def seating_capacity(self, capacity):
return f"The seating capacity of a {self.name} is {capacity} passengers"
class Bus(Vehicle):
# ✅ 正确:仅在子类方法签名中声明默认值,调用 super 时传递变量 capacity
def seating_capacity(self, capacity=50):
return super().seating_capacity(capacity)
School_bus = Bus("School Volvo", 180, 12)
print(School_bus.seating_capacity(42)
) # 输出: The seating capacity of a School Volvo is 42 passengers
print(School_bus.seating_capacity()) # 输出: The seating capacity of a School Volvo is 50 passengers因为这会覆盖调用时传入的实际参数——无论用户是否显式传入 42,super() 内部始终收到 50,导致 seating_capacity(42) 和 seating_capacity() 行为完全一致,失去默认参数的设计意义。
因此,这不是冗余的“重复代码”,而是面向对象中职责分离的体现:父类定义通用行为,子类定制接口契约。