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()
错误原因分析
set_waiting_passengers方法逻辑错误:该方法将传入参数用[waiting_passengers]包裹,导致waiting_pass变成嵌套列表(比如传入乘客名字列表后,最终waiting_pass为[[名字1,名字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
相关产品推荐
相关产品推荐

