solicitud de pase a una clase diferente en función del estado de Python

user7692855:

Estoy diseñando una API que se ocupa de diferentes tipos de vehículos por ejemplo coches, autobuses y furgonetas. Hay un punto final POST /vehicleque tendrá un cuerpo definido.

{
'registration': 'str',
'date_of_purchase': 'datetime str',
'vehicle_type': 'car'
...
}

Lo primero que hacemos es cargar un objeto basado en la VEHICLE_TYPE.

if body[vehicle_type] == 'car':
   passed_in_vehicle = Car(body)
elif body['vehicle_type'] == 'bus':
   passed_in_vehicle = Bus(body)
...

Dentro del programa de pitón hay múltiples clases que incluyen:

  • vehicles.py
  • cars.py
  • vans.py
  • buses.py

El punto de entrada de la API va a vehicles.py lo que hace un poco de lógica y luego dependiendo de la entrada encaminará a una de las otras clases para hacer la lógica más específica.

Cada clase tiene el mismo conjunto de métodos de base.

  • update_vehicle_specs
  • register_vehicle

En el momento en el fondo de vehicles.py tengo

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)
...

Sin embargo, esto no puede ser escalable. ¿Cuál es la solución correcta para encaminar a clases específicas sobre la base de una condición?

kabanus:

La forma en que se ve a mí, puede mejorar el diseño un poco. Dado que cada vehículo 'sabe' donde es atendida, probablemente debería hacer en cada una algo así como

def __init__(self, ..., service):
    super().__init__(self, ...)
    ...
    ...
    service.register_vehicle(self)

esto viene de la perspectiva de que "las unidades de coche al garaje para registrar" en lugar de las "miradas de garaje para los vehículos nuevos".

Al inicializar un vehículo, pasarla a su clase de servicio, como en

new_car = Car(..., my_car_service)

dónde

my_car_service = Cars()

antes en alguna parte. Esto es desde que asumimos cada nuevo coche tiene que registrarse, y no hacemos un nuevo servicio de cada vehículo nuevo. Otro enfoque, es que la clase contiene (composición) de su objeto de servicio desde el ir a buscar:

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

por lo que la clase contiene el objeto de dar servicio siempre, y todos los objetos inicializados comparten la misma a través de una variable de clase. Yo realmente prefiero esto.


En primer lugar la inicialización:

Con respecto a su inicialización inicial del vehículo, mientras que el uso localspodría ser una solución ingeniosa para eso, puede ser que sea un poco más de un tipo seguro de tener algo así como lo que tiene. En Python me gusta utilizar el "diccionario interruptor de Python" (TM) para ese tipo de cosas:

{'car': Car,
 'bus': Bus,
  ...
 'jet': Jet
}[body[vehicle_type]](body)

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=408619&siteId=1
Recomendado
Clasificación