Форум сайта python.su
from dataclasses import asdict, dataclass from typing import ClassVar, Dict, Type @dataclass class InfoMessage: """Информационное сообщение о тренировке.""" training_type: str duration: float distance: float speed: float calories: float MSG_STR: ClassVar[str] = ( 'Тип тренировки: {}; is ' 'Длительность: {:.3f} ч.; ' 'Дистанция: {:.3f} км; ' 'Ср. скорость: {:.3f} км/ч; ' 'Потрачено ккал: {:.3f}.' ) def get_message(self) -> str: """Получить строку сообщения.""" return self.MSG_STR.format(*asdict(self).values()) @dataclass class Training: """Базовый класс тренировки.""" action: int duration: float weight: float M_IN_KM: ClassVar[float] = 1000 M_IN_HOUR: ClassVar[float] = 60 LEN_STEP: ClassVar[float] = 0.65 def get_distance(self) -> float: """Получить дистанцию в км.""" return self.action * self.LEN_STEP / self.M_IN_KM def get_mean_speed(self) -> float: """Получить среднюю скорость движения.""" return self.get_distance() / self.duration def get_spent_calories(self) -> float: """Получить количество затраченных калорий.""" pass def show_training_info(self) -> InfoMessage: """Вернуть информационное сообщение о выполненной тренировке.""" return InfoMessage(self.__class__.__name__, self.duration, self.get_distance(), self.get_mean_speed(), self.get_spent_calories()) @dataclass class Running(Training): """Тренировка: бег.""" calories_mean_speed_multiplier: ClassVar[float] = 18 calories_mean_speed_subtrahend: ClassVar[float] = 20 def get_spent_calories(self) -> float: """Получить количество затраченных калорий при беге.""" return (self.calories_mean_speed_multiplier * self.get_mean_speed() - self.calories_mean_speed_subtrahend ) * self.weight / self.M_IN_KM * self.duration * self.M_IN_HOUR @dataclass class SportsWalking(Training): """Тренировка: спортивная ходьба.""" calories_weight_multiplier: ClassVar[float] = 0.035 calories_speed_height_weight_multiplier: ClassVar[float] = 0.029 height: float def get_spent_calories(self) -> float: """Получить количество затраченных калорий при спортивной ходьбе.""" return (self.calories_weight_multiplier * self.weight + (self.get_mean_speed() ** 2 // self.height) * self.calories_speed_height_weight_multiplier * self.weight ) * self.duration * self.M_IN_HOUR @dataclass class Swimming(Training): """Тренировка: плавание.""" LEN_STEP: ClassVar[float] = 1.38 length_pool: float count_pool: float def get_mean_speed(self) -> float: """Получить среднюю скорость плавания.""" return (self.length_pool * self.count_pool / self.M_IN_KM / self.duration ) def get_spent_calories(self) -> float: """Получить количество затраченных калорий при плавании.""" NUM_1 = 1.1 NUM_2 = 2 return (self.get_mean_speed() + NUM_1) * NUM_2 * self.weight def read_package(workout_type: str, data: list) -> Training: """Прочитать данные полученные от датчиков.""" workouts: Dict[str, Type[Training]] = { 'RUN': Running, 'WLK': SportsWalking, 'SWM': Swimming } return workouts[workout_type](*data) def main(training: Training) -> None: """Главная функция.""" info = training.show_training_info() print(info.get_message()) if __name__ == '__main__': packages = [ ('SWM', [720, 1, 80, 25, 40]), ('RUN', [15000, 1, 75]), ('WLK', [9000, 1, 75, 180]), ] for workout_type, data in packages: training = read_package(workout_type, data) main(training)
Офлайн
return self.MSG_STR.format(*asdict(self).values())
Офлайн