Python OOP问题:Vehicle类fare方法调用报错,无法得到预期结果
问题分析与代码修正
错误原因
实例方法缺少
self参数:
你的fare方法定义为def fare(capacity):,但Python中所有实例方法的第一个参数必须是self(代表实例本身)。当你调用vehicle.fare()时,Python会自动将vehicle实例作为第一个参数传入fare,此时capacity变量接收的是Vehicle对象,而非预期的容量数值,这就导致了TypeError: unsupported operand type(s) for *: 'Vehicle' and 'int'错误。车费计算未使用实例属性:
seating_capacity方法已经将容量值赋值给了self.capacity,但fare方法却试图通过参数获取容量,没有利用实例已存储的属性。另外,若用户未主动调用seating_capacity,实例中可能不存在capacity属性,会引发额外错误。
修正后的代码
class Vehicle: def __init__(self, max_speed, mileage): self.max_speed = max_speed self.mileage = mileage self.capacity = 4 # 初始化默认容量 def seating_capacity(self, capacity=4): self.capacity = capacity return capacity def fare(self): # 使用实例的capacity属性计算车费 return self.capacity * 10 class Bus(Vehicle): def __init__(self, max_speed, mileage): super().__init__(max_speed, mileage) # 推荐使用super()调用父类构造方法 def seating_capacity(self, capacity=50): return super().seating_capacity(capacity) # 测试Vehicle实例 vehicle = Vehicle(240, 18) print(f"Vehicle total fare is {vehicle.fare()}") # 输出:Vehicle total fare is 40 # 测试Bus实例(可选) bus = Bus(120, 20) print(f"Bus total fare is {bus.fare()}") # 输出:Bus total fare is 500
关键修改点
- 给
fare方法添加self参数,符合Python实例方法的规范。 - 在
Vehicle的__init__中初始化self.capacity =4,确保实例始终有默认容量值。 fare方法通过self.capacity获取容量,与seating_capacity方法的状态保持一致。- 优化
Bus类的构造方法,使用super().__init__()替代直接调用父类构造,代码更简洁且适配多继承场景。
内容的提问来源于stack exchange,提问作者aadinnvv
相关产品推荐
相关产品推荐

