本文详解如何正确实现一个 python `car` 类,重点修复刹车方法中的语法错误和逻辑问题,确保速度属性能按预期递减(每次减 5),并在达到 0 后不再为负值。
在面向对象编程实践中,Car 类是一个经典的教学示例,用于演示属性封装、方法调用与状态维护。但初学者常因语法细节或边界逻辑疏忽导致行为异常——例如本例中刹车后速度持续为负、甚至卡死在 -5,根源在于代码存在两处关键问题:
- 语法错误:self.__speed = -=5 是非法语句,Python 不支持 = -= 这类混合赋值运算符;正确写法应为 self.__speed -= 5 或 self.__speed += -5;
- 逻辑缺陷:原需求要求“刹车至 0 后停止递减”,但原始代码未做非负校验,导致速度可无限降低。
此外,原示例中使用了双下划线前缀(如 __year_model)试图实现私有属性,但未配套提供 getter/setter,且测试代码传参顺序与构造函数定义不一致("Corvette", 2022 vs __year_model, __make),易引发混淆。为兼顾可读性与教学实用性,我们采用单下划线约定(_year_model)表示受保护属性,并显式处理速度下限。
以下是修正后的完整 Car 类实现:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class Car:
def __init__(self, year_model, make):
self._year_model = year_model
self._make = make
self._speed = 0
def accelerate(self):
self._speed += 5
def brake(self):
self._speed = max(0, self._speed - 5) # 关键:防止速度低于0
def get_speed(self):
return self._speed
|
使用示例:

微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
my_car = Car(2022, "Corvette") # 注意参数顺序:year_model 在前,make 在后
# 先加速5次,达到25
for i in range(5):
my_car.accelerate()
print(f"accelerate {i}: {my_car.get_speed()}")
print()
# 再刹车5次,从25→20→15→10→5→0(不再为负)
for i in range(5):
my_car.brake()
print(f"brake {i}: {my_car.get_speed()}")
|
输出结果完全符合预期:
|
1
2
3
4
5
6
7
8
9
10
11
|
accelerate 0: 5
accelerate 1: 10
accelerate 2: 15
accelerate 3: 20
accelerate 4: 25
brake 0: 20
brake 1: 15
brake 2: 10
brake 3: 5
brake 4: 0
|
注意事项总结:
- ? 使用 self._speed -= 5 替代非法语法 self._speed = -=5;
- ? 用 max(0, ...) 确保刹车后速度不低于零,体现真实车辆物理约束;
- ? 构造函数参数顺序需与实例化时一致(建议按 year_model, make 定义并调用);
- ? 若需严格私有化,可保留双下划线并配合 @property 实现安全访问,但对基础练习而言,单下划线 + 显式方法已足够清晰可靠。
|