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

Python铁路系统项目报错'list' object has no attribute 'end_stop'求助

铁路系统登车函数AttributeError问题解决

问题重现

执行train1.board_passengers()时触发以下错误:

AttributeError: 'list' object has no attribute 'end_stop'

相关代码实现

Station类

class Station:
  def __init__(self, name, number_of_tracks):
    self.name = name
    self.number_of_tracks = number_of_tracks
    self.waiting_pass = []

  def __str__(self):
    return(f"Station {self.name} has {self.number_of_tracks} tracks. The passengers waiting are {self.waiting_pass}")

  def set_waiting_passengers(self, waiting_passengers):
    self.waiting_pass = [waiting_passengers]

Centraal子类

class Centraal(Station):
  def __init__(self, name, list_of_stores):
    self.name = name
    self.number_of_tracks = 10
    self.waiting_pass = []
    self.list_of_stores = list_of_stores

  def add_store(self, store):
    self.list_of_stores.append(store)

  def remove_store(self, store):
    if store in self.list_of_stores:
      self.list_of_stores.remove(store)

Passenger类

class Passenger:
  def __init__(self, name, start_stop, end_stop):
    self.name = name
    self.start_stop = start_stop
    self.end_stop = end_stop
    self.has_arrived = False

  def arrived(self):
   self.has_arrived = True

  def __repr__(self):
    travel_str = "travelled" if self.has_arrived else "travels"
    return f"{self.name} {travel_str} from {self.start_stop} to {self.end_stop}"

Train类

class Train:
  def __init__(self, num_train_parts, capacity, speed, route):
    self.num_train_parts = num_train_parts
    self.capacity = capacity
    self.speed = speed
    self.route = route
    self.current_stop_index = 0
    self.current_stop = self.route[self.current_stop_index]
    self.passengers = []

  def get_current_stop(self):
    return self.current_stop

  def go_next_stop(self):
    if self.current_stop_index < len(self.route) -1:
      self.current_stop_index += 1
      self.current_stop = self.route[self.current_stop_index]
    else:
      print("This is the last stop on the route")

  def set_passengers(self, passengers):
    self.passengers = passengers

  def board_passengers(self):
    current_stop = self.get_current_stop()
    waiting_passengers = current_stop.waiting_pass.copy()
    for passenger in waiting_passengers:
      if len(self.passengers) < self.capacity:
        if passenger.end_stop in self.route:
          self.passengers.append(passenger)
          current_stop.waiting_pass.remove(passenger)
      else:
        break

  def unboard_passengers(self):
    current_stop = self.get_current_stop()
    remaining_passengers = self.passengers.copy()
    for passenger in remaining_passengers:
      if passenger.end_stop == current_stop.name:
        self.passengers.remove(passenger)

乘客与站点初始化代码

station_r_a = Station("Rotterdam Alexander", 2)
station_r_c = Centraal("Rotterdam Centraal", ['Hema', 'AH to go', 'Dudok'])

list_of_passengers = []
for id in range(10):
    passenger = Passenger(id, station_r_c, station_r_a)
    list_of_passengers.append(passenger)

station_r_c.set_waiting_passengers([passenger.name for passenger in list_of_passengers])

触发错误的代码

train1 = Train(2, 10, 120, [station_r_c, station_r_a])
train1.board_passengers()

错误原因分析

  1. set_waiting_passengers方法逻辑错误:该方法将传入参数用[waiting_passengers]包裹,导致waiting_pass变成嵌套列表(比如传入乘客名字列表后,最终waiting_pass为[[名字1,名字2,...]]),遍历的时候拿到的是子列表而非单个乘客元素。
  2. 传入数据类型错误:初始化时调用station_r_c.set_waiting_passengers([passenger.name for passenger in list_of_passengers]),传入的是字符串列表,而非Passenger实例,后续遍历自然无法获取end_stop属性。

修复步骤

步骤1:修正Station.set_waiting_passengers方法

去掉多余的列表包裹,直接赋值:

def set_waiting_passengers(self, waiting_passengers):
    self.waiting_pass = waiting_passengers

步骤2:传入Passenger实例而非名字

修改乘客初始化后的赋值代码,直接传入Passenger实例列表:

station_r_c.set_waiting_passengers(list_of_passengers)

额外优化建议

  • 给Station类添加add_waiting_passenger方法,用于单个添加乘客,避免直接操作列表:
    def add_waiting_passenger(self, passenger):
        self.waiting_pass.append(passenger)
    
  • Centraal类的__init__调用父类构造方法,减少重复代码:
    class Centraal(Station):
      def __init__(self, name, list_of_stores):
        super().__init__(name, 10)
        self.list_of_stores = list_of_stores
    

内容的提问来源于stack exchange,提问作者JasperJ1998

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:50:24