主文件调用DeliveryManager方法报错:缺少必选位置参数,求修复方案
问题及修复方案
错误原因
你遇到的错误来自两处逻辑矛盾:
DeliveryManager类的__init__方法要求必须传入truck参数,但主文件中创建实例时delivery_manager = DeliveryManager()未传参,触发参数缺失报错。delivering_packages方法单独接收truck参数,但类实例本身已通过__init__绑定了self.truck,设计冗余且逻辑冲突。
结合你用同一个实例批量处理多辆卡车的场景,推荐以下修复方案:
修复方案一:调整为无状态工具类(适配多卡车批量处理)
让DeliveryManager不需要在初始化时绑定特定卡车,通过delivering_packages方法接收待处理卡车,更贴合你的业务需求。
修改后的DeliveryManager.py代码
class DeliveryManager: def __init__(self): # 无需绑定truck,改为无状态实例 pass def __str__(self): return "DeliveryManager Instance" def delivering_packages(self, truck): not_delivered = [hash_table_package.lookup(packageID) for packageID in truck.packages] truck.packages.clear() current_address = extract_address(truck.address) while not_delivered: next_package = min(not_delivered, key=lambda package: distance_in_between(current_address, extract_address(package.address))) next_distance = distance_in_between(current_address, extract_address(next_package.address)) truck.packages.append(next_package.ID) not_delivered.remove(next_package) truck.mileage += next_distance truck.address = next_package.address truck.time += datetime.timedelta(hours=next_distance / 18) next_package.delivery_time = truck.time next_package.departure_time = truck.depart_time current_address = extract_address(next_package.address)
主文件代码(初始化部分无需修改)
from DeliveryManager import DeliveryManager delivery_manager = DeliveryManager() def deliver_all_packages(trucks): for i, truck in enumerate(trucks[:-1]): delivery_manager.delivering_packages(truck) last_truck = trucks[-1] last_truck.depart_time = min(truck.time for truck in trucks[:-1]) delivery_manager.delivering_packages(last_truck) trucks = [truck1, truck2, truck3] deliver_all_packages(trucks)
修复方案二:绑定单辆卡车(适合单卡车专属处理场景)
如果业务逻辑是每个DeliveryManager仅处理一辆卡车,可调整delivering_packages方法不再接收参数,直接使用实例绑定的self.truck:
修改后的DeliveryManager.py代码
class DeliveryManager: def __init__(self, truck): self.truck = truck def __str__(self): return str(self.truck) # 修正:__str__必须返回字符串,原代码返回对象会报错 def delivering_packages(self): truck = self.truck not_delivered = [hash_table_package.lookup(packageID) for packageID in truck.packages] truck.packages.clear() current_address = extract_address(truck.address) while not_delivered: next_package = min(not_delivered, key=lambda package: distance_in_between(current_address, extract_address(package.address))) next_distance = distance_in_between(current_address, extract_address(next_package.address)) truck.packages.append(next_package.ID) not_delivered.remove(next_package) truck.mileage += next_distance truck.address = next_package.address truck.time += datetime.timedelta(hours=next_distance / 18) next_package.delivery_time = truck.time next_package.departure_time = truck.depart_time current_address = extract_address(next_package.address)
对应的主文件调用方式
from DeliveryManager import DeliveryManager def deliver_all_packages(trucks): for i, truck in enumerate(trucks[:-1]): # 为每辆卡车创建专属DeliveryManager实例 delivery_manager = DeliveryManager(truck) delivery_manager.delivering_packages() last_truck = trucks[-1] last_truck.depart_time = min(truck.time for truck in trucks[:-1]) delivery_manager = DeliveryManager(last_truck) delivery_manager.delivering_packages() trucks = [truck1, truck2, truck3] deliver_all_packages(trucks)
额外注意点
- 原
__str__方法返回self.truck对象会导致打印报错,建议改为返回字符串类型。 - 确保
hash_table_package、extract_address、distance_in_between等外部函数已正确定义并导入。
内容的提问来源于stack exchange,提问作者coopertino7
相关产品推荐
相关产品推荐

