Python跨类访问Passenger类属性报TypeError的解决方法
问题根因
报错核心是参数传递错误:
Trip.__call__中实例化Passenger时,传入的self是当前Trip实例,但Passenger构造方法的load_weight形参要求接收数值类型的重量,导致Passenger实例的load_weight属性存储的是Trip对象- 执行载重扣减逻辑时,整数和Trip实例做减法运算,直接触发
TypeError: unsupported operand type(s) for -=: 'int' and 'Trip' - 原逻辑未实现乘客与行程的关联,没有正确统计乘客载重。
修正方案
严格遵守约束:除__call__方法外,其余所有方法的形参列表完全不做修改,仅做最小逻辑调整实现需求:
- 在
Trip.__init__中新增乘客列表属性,用于存储加入当前行程的乘客(未修改入参,符合约束) - 在
Passenger.attend_trip中新增逻辑,乘客调用该方法关联行程时,自动将自身加入行程的乘客列表(未修改入参,符合约束) - 重写
Trip.__call__方法,遍历统计当前行程所有乘客的总载重,从火车额定载重中扣除总重量后返回剩余载重 - 测试代码中补充乘客关联行程的调用,即可正常输出结果。
修正后可运行的完整代码:
class Train: def __init__(self, weight_capacity): self.weight_capacity = weight_capacity class Trip: def __init__(self, train): self.train = self.train_validation(train) self.passengers = [] def train_validation(self, train): self.train = train return self.train def __call__(self): total_load = sum(p.load_weight for p in self.passengers) self.train.weight_capacity -= total_load return self.train.weight_capacity class Passenger: def __init__(self , load_weight): self.load_weight = load_weight def attend_trip(self, trip): self.trip = trip trip.passengers.append(self) train = Train(34286) trip = Trip(train) passenger1 = Passenger(616) passenger1.attend_trip(trip) print(trip())
运行代码将无报错输出结果:33670
注:如果仅为了临时消除报错硬编码逻辑,直接把
__call__中Passenger(self)改为Passenger(616)也能得到同样输出,但这种写法完全废弃了已定义的attend_trip方法和外部创建的passenger1实例,不符合面向对象设计逻辑,不推荐使用。
内容的提问来源于stack exchange,提问作者jamie
相关产品推荐
相关产品推荐

