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

标签 python

我正在设计一个 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/

相关文章:

python - 仅计算图像的核心图像数据(不包括元数据)的哈希值

python - 元组的子元组

python - 在 Python 中单独测试正无穷大或负无穷大

python - 在 PsychoPy 中记录所有按键以及等待按键?

python - 通过后缀组合列表元素

python - 传出负载均衡器

python - sqlalchemy,过滤包含数组的json列

python - Selenium chromedriver 2.25 TimeoutException 无法确定加载状态

python - 如何从 Pandas 数据框中的 4 个级别创建两个垃圾箱?

python - Pandas Dataframe 上的滑动窗口