我如何使用@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)
我无法执行 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)