我如何使用@dataclass 实现 *asdict() 或 *asdict()

How I can implement *asdict() or *asdict() using @dataclass

我无法执行 asdisct。我看了资料,但是使用asdict还是有错误。

@dataclass
class InfoMessage():
    """Информационное сообщение o тренировке."""
    def __init__(self,
                 training_type: str,  # Тип тренировки.
                 duration: float,  # Продолжительность тренировки.
                 distance: float,  # Продолжительность тренировки.
                 speed: float,  # Дистанция, выполняемая на тренировке.
                 calories: float) -> None:  # Калории, сжигаемые на тренировке.
        self.training_type = training_type    # имя класса тренировки.
        self.duration = duration    # длительность тренировки в часах.
        # дистанция в километрах, которую преодолел пользователь
        # за время тренировки.
        self.distance = distance
        # средняя скорость, с которой двигался пользователь.
        self.speed = speed
        # количество килокалорий, которое израсходовал пользователь
        # за время тренировки.
        self.calories = calories
        self.message = ('Тип тренировки: {self.training_type}_1d;'
                        'Длительность: {self.duration:.3f}_1d ч.; '
                        'Дистанция: {self.distance:.3f}_1d км; '
                        'Ср. скорость: {self.speed:.3f}_1d км/ч; '
                        'Потрачено ккал: {self.calories:.3f}_1d.')

    def get_message(self) -> str:
        """функция для отображения окончательного сообщения."""
        return self.message.format(*asdict(self))

我不认为你在这里使用 @dataclass 装饰器,但你也不需要解决你的问题。如果您将 self 传递给您的字符串模板,它的格式应该很好。

    def get_message(self) -> str:
        return self.message.format(self=self)

但是,我认为您使用 dataclass 是正确的,因为这可以使您的代码更简单:

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

如果您仅将此用于调试目的,那么您可能会发现来自 dataclass 的自然字符串化就足够了:

print(InfoMessage(training_type="training type", duration=1, distance=2, speed=3.0, calories=4.0))

# InfoMessage(training_type='training type', duration=1, distance=2, speed=3.0, calories=4.0)