Ejemplo de uso de clases de datos (data class) y clases enumeradas (enum class) en Python. Para ello definimos una clase de vehículos con sus atributos tipo, peso, unidad de peso, velocidad y unidad de velocidad.
En este ejemplo Python desarrollamos tres clases Enum para definir los tipos de vehículos (TipoVehiculo), las unidades de velocidad (UnidadesVelocidad) y las unidades de peso (UnidadesPeso). Por otro lado, definiremos la clase principal de nuestra app en Python Vehiculo, donde especificaremos los atributos de esta clase de datos: tipo, velocidad, unidad de peso, peso y unidad de velocidad. En esta clase definiremos el constructor, donde comprobaremos que el peso y la velocidad sean mayores que cero, en caso de no serlo, devolveremos un error personalizado. Además, en esta clase definiremos un método para convertir los nudos a kilómetros por hora y otro método para convertir las unidades de peso siempre a kilógramos. Por último, sobrecargamos el método estándar «add» para adaptarlo a nuestras necesidades.
El código de ejemplo en Python (con las líneas más importantes comentadas y explicadas):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
from dataclasses import dataclass from enum import Enum # Definimos las clases de tipo Enum para valores fijos # Enum sirve para definir un conjunto de nombres simbólicos vinculados a valores únicos class TipoVehiculo(Enum): COCHE = "Coche" BICI = "Bicicleta" MOTO = "Motocicleta" CAM = "Camión" BARCO = "Barco" AVION = "Avión" class UnidadesVelocidad(Enum): KM_H = "Km/Hora" NU = "Nudos" class UnidadesPeso(Enum): KG = "Kg" TO = "Toneladas" G = "g" # Definimos la clase de datos para darle entidad a los vehículos # Si queremos hacer los valores de los atributos de la clase inmutables añadiríamos #@dataclass(frozen=True) @dataclass() class Vehiculo: tipo: TipoVehiculo velocidad: float unPeso: UnidadesPeso peso: float unVelocidad: UnidadesVelocidad = None # Definimos el constructor de la clase def __post_init__(self) -> None: # Hacemos alguna comprobación en el propio constructor # Si la velocidad es inferior a cero, se devuelve un error personalizado if self.velocidad < 0: raise ValueError("La velocidad del vehículo no puede ser negativa.") # De igual forma, para el peso if self.peso < 0: raise ValueError("El peso no puede ser negativo.") # Establecemos la unidad de velocidad en función del tipo de vehículo if self.tipo == TipoVehiculo.BARCO: self.unVelocidad = UnidadesVelocidad.NU else: self.unVelocidad = UnidadesVelocidad.KM_H # Método para convertir la velocidad de Nudos a Km/Hora # Comprobará la unidad de velocidad la entidad instanciada, # si son Nudos, realizaremos la conversión def convertir_a_km(self) -> float: if self.unVelocidad == UnidadesVelocidad.NU: return self.velocidad * 1.852 # Si son Km/h, no hacemos conversión return self.velocidad # Método para convertir el peso a gramos # Comprobará la unidad de peso de la entidad instanciada, # si son Toneladas o gramos, realizaremos la conversión a Kg def convertir_a_kg(self) -> float: if self.unPeso == UnidadesPeso.TO: return self.peso / 1000 if self.unPeso == UnidadesPeso.G: return self.peso * 1000 # Si son Kg, no hacemos conversión return self.peso # Sobrecargamos el método add para personalizarlo y sumar pesos, # para sumar siempre unidades de peso iguales def __add__(self, other: "UnidadesPeso") -> "UnidadesPeso": return UnidadesPeso(self.convertir_a_kg() + other.convertir_a_kg(), UnidadesPeso.KG) # Probando las clases de datos (data class) y Enum # Instanciamos tres objetos de la clase Vehiculo cocheFord = Vehiculo(tipo=TipoVehiculo.COCHE, velocidad=150, peso=650, unPeso=UnidadesPeso.KG) cocheSeat = Vehiculo(tipo=TipoVehiculo.COCHE, velocidad=150, peso=650, unPeso=UnidadesPeso.KG) barcoTransatlantico = Vehiculo(tipo=TipoVehiculo.BARCO, velocidad=23, peso=150500, unPeso=UnidadesPeso.TO) barcoVela = Vehiculo(tipo=TipoVehiculo.BARCO, velocidad=11, peso=2200, unPeso=UnidadesPeso.KG) # Mostramos los objetos por pantalla (con todos sus atributos) print(cocheFord, cocheSeat, barcoTransatlantico, barcoVela) print() # Sumamos los pesos de varios vehículos para probar el método suma sobrecargado print(f"El peso de un transatlántico más un coche Ford es de: {cocheFord.peso + barcoTransatlantico.peso} kg") print() print(f"La velocidad en nudos del transatlántico es de {barcoTransatlantico.velocidad}") print(f"La velocidad del transatlántico en Km/Hora es de {barcoTransatlantico.convertir_a_km()}") |
La ejecución del código anterior dará este resultado:
1 2 3 4 5 6 |
Vehiculo(tipo=<TipoVehiculo.COCHE: 'Coche'>, velocidad=150, unPeso=<UnidadesPeso.KG: 'Kg'>, peso=650, unVelocidad=<UnidadesVelocidad.KM_H: 'Km/Hora'>) Vehiculo(tipo=<TipoVehiculo.COCHE: 'Coche'>, velocidad=150, unPeso=<UnidadesPeso.KG: 'Kg'>, peso=650, unVelocidad=<UnidadesVelocidad.KM_H: 'Km/Hora'>) Vehiculo(tipo=<TipoVehiculo.BARCO: 'Barco'>, velocidad=23, unPeso=<UnidadesPeso.TO: 'Toneladas'>, peso=150500, unVelocidad=<UnidadesVelocidad.NU: 'Nudos'>) Vehiculo(tipo=<TipoVehiculo.BARCO: 'Barco'>, velocidad=11, unPeso=<UnidadesPeso.KG: 'Kg'>, peso=2200, unVelocidad=<UnidadesVelocidad.NU: 'Nudos'>) El peso de un transatlántico más un coche Ford es de: 151150 kg La velocidad en nudos del transatlántico es de 23 La velocidad del transatlántico en Km/Hora es de 42.596000000000004 |
