You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 15:18:13