我正在设计一个 API,用于处理不同类型的车辆,例如汽车、公共(public)汽车和货车。有一个端点 POST/vehicle
将采用定义的主体。
{
'registration': 'str',
'date_of_purchase': 'datetime str',
'vehicle_type': 'car'
...
}
我们做的第一件事是根据 vehicle_type 加载一个对象。
if body[vehicle_type] == 'car':
passed_in_vehicle = Car(body)
elif body['vehicle_type'] == 'bus':
passed_in_vehicle = Bus(body)
...
在 python 程序中有多个类,包括:
- 车辆.py
- 汽车.py
- 货车.py
- buses.py
API 入口点转到 vehicles.py,它执行一些逻辑,然后根据输入将其路由到其他类之一以执行更具体的逻辑。
每个类都有相同的一组基本方法。
- update_vehicle_specs
- 注册车辆
此刻我在 vehicles.py 的底部
if is_instance(passed_in_vehicle, Car):
carService = Cars()
carService.register_vehicle(passed_in_vehicle)
elif is_instance(passed_in_vehicle, Van):
vanService = Vans()
vanService.register_vehicle(passed_in_vehicle)
...
但是,这无法扩展。根据条件路由到特定类的正确解决方案是什么?
最佳答案
在我看来,您可以稍微改进一下设计。因为每辆车都“知道”它在哪里维修,所以你应该在每辆车上做类似的事情
def __init__(self, ..., service):
super().__init__(self, ...)
...
...
service.register_vehicle(self)
这是从“车开到车库去登记”而不是“车库找新车”的角度来看的。
初始化车辆时,将其服务类传递给它,如
new_car = Car(..., my_car_service)
在哪里
my_car_service = Cars()
之前的某个地方。这是因为我们假设每辆新车都需要注册,并且我们不会为每辆新车提供新服务。另一种方法是让类从一开始就包含(组合)其服务对象:
class Car:
service = Cars()
def __init__(...)
...
Car.service.register_vehicle(self)
因此该类始终包含服务对象,并且所有初始化对象通过类变量共享同一个对象。我实际上更喜欢这个。
第一次初始化:
关于您对车辆的初始初始化,虽然使用 locals
可能是一个很好的解决方案,但拥有像您所拥有的东西可能更安全一些。在 Python 中,我喜欢将“Python 开关字典”(TM) 用于类似的东西:
{'car': Car,
'bus': Bus,
...
'jet': Jet
}[body[vehicle_type]](body)
关于python - 根据条件Python将请求传递给不同的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60991654/