根据Python的条件将请求传递给不同的类

2024-04-04

我正在设计一个 API,它处理不同类型的车辆,例如轿车、公共汽车和货车。有一个端点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
  • cars.py
  • vans.py
  • buses.py

API 入口点转到 cars.py,它执行一些逻辑,然后根据输入将其路由到其他类之一以执行更具体的逻辑。

每个类都有相同的一组基本方法。

  • 更新车辆规格
  • 注册车辆

目前在 cars.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)

where

my_car_service = Cars()

之前的某个地方。这是因为我们假设每辆新车都需要注册,并且我们不会为每辆新车提供新服务。另一种方法是让类从一开始就包含(组合)其服务对象:

class Car:
    service = Cars()
    def __init__(...)
        ...
        Car.service.register_vehicle(self)

因此该类始终包含服务对象,并且所有初始化的对象通过类变量共享同一个对象。我其实更喜欢这个。


第一次初始化:

关于车辆的初始初始化,在使用时locals可能是一个很好的解决方案,拥有像您拥有的东西可能会更安全一些。在 Python 中,我喜欢使用“Python switchdictionary”(TM)来完成类似的事情:

{'car': Car,
 'bus': Bus,
  ...
 'jet': Jet
}[body[vehicle_type]](body)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据Python的条件将请求传递给不同的类 的相关文章

随机推荐