如何访问列表中嵌套对象的Python属性以计算车辆与乘客距离?
解决嵌套属性访问与距离计算问题
1. 访问嵌套的Location属性
要访问列表中对象的嵌套Location属性,直接通过属性层级链式访问即可:
- 针对
CarSharingApp中的车辆:车辆对象.location.x、车辆对象.location.y - 针对乘客:
乘客对象.location.x、乘客对象.location.y
举个实际例子,从CarSharingApp的列表中取出对象后逐层获取坐标:
# 取出第一个乘客和第一个车辆 passenger = mobileApp.passengers[0] car = mobileApp.cars[0] # 获取乘客坐标 passenger_x = passenger.location.x passenger_y = passenger.location.y # 获取车辆坐标 car_x = car.location.x car_y = car.location.y
2. 计算车辆与乘客的距离
用欧几里得距离公式即可完成计算,我们可以把这个逻辑封装成独立函数,方便复用:
import math def calculate_distance(passenger_loc, car_loc): # 欧几里得距离计算公式 return math.sqrt((passenger_loc.x - car_loc.x)**2 + (passenger_loc.y - car_loc.y)**2)
3. 代码优化建议
你的CarSharingApp中cars和passengers是类属性,这会导致所有CarSharingApp实例共享同一个列表,不符合实际应用场景,建议改成实例属性,让每个App实例拥有独立的车辆和乘客列表:
class CarSharingApp: def __init__(self): self.cars = [] # 实例属性:每个App实例专属的车辆列表 self.passengers = [] # 实例属性:每个App实例专属的乘客列表 def add_car(self, car): self.cars.append(car) print(f"Car successfully added.") def add_passenger(self, passenger): self.passengers.append(passenger) print(f"Passenger successfully added.")
完整带功能的示例代码
整合所有逻辑,添加一个"查找乘客最近车辆"的功能,完整代码如下:
import math class Location: def __init__(self, x, y): self.x = x self.y = y class Passenger: def __init__(self, passenger_name, location): self.passenger_name = passenger_name self.location = location class Car: def __init__(self, car_name, location, cost_per_mile): self.car_name = car_name self.location = location self.cost_per_mile = cost_per_mile def calculate_distance(passenger_loc, car_loc): return math.sqrt((passenger_loc.x - car_loc.x)**2 + (passenger_loc.y - car_loc.y)**2) class CarSharingApp: def __init__(self): self.cars = [] self.passengers = [] def add_car(self, car): self.cars.append(car) print(f"Car successfully added.") def add_passenger(self, passenger): self.passengers.append(passenger) print(f"Passenger successfully added.") def find_closest_car(self, passenger_name): # 定位目标乘客 target_passenger = None for p in self.passengers: if p.passenger_name == passenger_name: target_passenger = p break if not target_passenger: print("Passenger not found.") return # 遍历车辆找最近的 closest_car = None min_distance = float('inf') for car in self.cars: distance = calculate_distance(target_passenger.location, car.location) if distance < min_distance: min_distance = distance closest_car = car print(f"Closest car to {passenger_name} is {closest_car.car_name}, distance: {min_distance:.2f} units") return closest_car # 初始化测试数据 location1 = Location(0,0) location2 = Location(1,1) passenger1 = Passenger("John Doe", location1) car1 = Car("car1", location2, 0.5) # 创建App实例并添加数据 mobileApp = CarSharingApp() mobileApp.add_car(car1) mobileApp.add_passenger(passenger1) # 执行找车功能 mobileApp.find_closest_car("John Doe")
运行后输出:
Car successfully added. Passenger successfully added. Closest car to John Doe is car1, distance: 1.41 units
内容的提问来源于stack exchange,提问作者user159
相关产品推荐
相关产品推荐

