Untitled

 avatar
user_3579462654
python
2 years ago
6.6 kB
31
Indexable
Never
from dataclasses import dataclass

@dataclass
class InfoMessage:
    """Информационное сообщение о тренировке."""
    
    training_type: str
    duration: float
    distance: float
    speed: float
    calories: float
    
    def get_message(self) -> str:
        return (f'Тип тренировки: {self.training_type}; '
                f'Длительность: {self.duration:.3f} ч.; '
                f'Дистанция: {self.distance:.3f} км; '
                f'Ср. скорость: {self.speed:.3f} км/ч; '
                f'Потрачено ккал: {self.calories:.3f}.')

class Training:
    """Базовый класс тренировки."""
    
    LEN_STEP: float = 0.65
    M_IN_KM: int = 1000

    def __init__(self,
                 action: int,
                 duration: float,
                 weight: float) -> None:
        self.action = action
        self.duration = duration
        self.weight = weight
        self.LEN_STEP = 0.65
        self.M_IN_KM: int = 1000
        self.MIN_IN_HR: int = 60
        self.training_type = 'unknown'
        self.distance = self.get_distance()
        self.mean_speed = self.get_mean_speed()
        self.spent_calories = self.get_spent_calories()

    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:
        """Получить количество затраченных калорий.
        Возвращает количество килокалорий, израсходованных за время тренировки.
        """

    def show_training_info(self) -> InfoMessage:
        """Вернуть информационное сообщение о выполненной тренировке.
        Возвращает объект класса сообщения."""
        
        return InfoMessage(
            type(self).__name__,
            self.duration,
            self.distance,
            self.mean_speed,
            self.spent_calories)


class Running(Training):
    """Тренировка: бег."""
    
    COEFF_CALORIE_1: float = 18.0
    COEFF_CALORIE_2: float = 20.0
    
    def __init__(self,
                 action: int,
                 duration: float,
                 weight: float) -> None:
        self.COEFF_CALORIE_1
        self.COEFF_CALORIE_2
        super().__init__(action, duration, weight)
        self.training_type = 'Running'

    def get_spent_calories(self) -> float:
        """Получить количество
        затраченных калорий для тренировки по бегу.
        """
        return ((self.COEFF_CALORIE_1 * self.get_mean_speed()
                                - self.COEFF_CALORIE_2) * self.weight
                               / self.M_IN_KM
                               * (self.duration * self.MIN_IN_HR))


class Swimming(Training):
    """Тренировка: плавание."""
    
    COEFF_MIN_SPEED:float = 1.1
    COEFF_WEIGHT:float = 2
    LEN_STEP:float = 1.38
    
    def __init__(self,
                 action: int,
                 duration: float,
                 weight: float,
                 length_pool: int,
                 count_pool: int) -> None:
        self.COEFF_MIN_SPEED
        self.COEFF_WEIGHT
        self.length_pool: int = length_pool
        self.count_pool: int = count_pool
        super().__init__(action, duration, weight)
        self.training_type: str = 'Swimming'
        self.distance = self.get_distance()
        self.LEN_STEP

    def get_distance(self) -> float:
        """Получить дистанцию в км,
        которую преодолел пользователь за время тренировки.
        """
        return self.action * self.LEN_STEP / self.M_IN_KM

    def get_spent_calories(self) -> float:
        """Получить количество затраченных калорий."""
        return (self.get_mean_speed() + self.COEFF_MIN_SPEED) * self.COEFF_WEIGHT * self.weight

    def get_mean_speed(self) -> float:
        """Получить среднюю скорость движения.
        Возвращает значение средней скорости движения во время тренировки.
        """
        return (self.length_pool * self.count_pool
                / self.M_IN_KM
                / self.duration)


class SportsWalking(Training):
    """Тренировка: спортивная ходьба."""
    
    COEFF_CALORIE_3: float = 0.035
    COEFF_CALORIE_4: float = 0.029
    
    def __init__(self,
                 action: int,
                 duration: float,
                 weight: float,
                 height: int) -> None:
        self.COEFF_CALORIE_3
        self.COEFF_CALORIE_4
        self.height = height
        super().__init__(action, duration, weight)
        self.training_type = 'SportsWalking'

    def get_spent_calories(self) -> float:
        """Получить количество затраченных калорий для тренировки по бегу."""
        return ((self.COEFF_CALORIE_3 * self.weight 
            + (self.get_mean_speed() ** 2 // self.height) 
            * self.COEFF_CALORIE_4 * self.weight) 
            * self.duration * self.MIN_IN_HR)


def read_package(workout_type: str, data: list) -> Training:
    """Прочитать данные полученные от датчиков."""
    training_types: dict[str][type] = {
        'SWM': Swimming,
        'RUN': Running,
        'WLK': SportsWalking}
    return training_types[workout_type](*data)


def main(training: Training) -> str:
    """Главная функция."""
    result = training.show_training_info()
    print(result.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)
        print('')