__post_init__ — это специальный метод в Python dataclasses, который запускается автоматически после завершения автоматически сгенерированного метода __init__. Он позволяет добавить пользовательскую логику без переопределения всего конструктора.
Когда @dataclass генерирует свой __init__, он вставляет вызов __post_init__ в конец — но только если метод определён. Поля, отмеченные как field(init=False), исключаются из конструктора и обычно присваиваются внутри __post_init__.
@dataclass
class Temperature:
celsius: float
fahrenheit: float = field(init=False)
def __post_init__(self):
if self.celsius < -273.15:
raise ValueError("Temperature below absolute zero.")
self.fahrenheit = self.celsius * 9/5 + 32
Здесь fahrenheit исключён из __init__ с помощью field(init=False), а затем вычисляется и валидируется внутри __post_init__.
Использование __post_init__ держит твой dataclass чистым и идиоматичным — ты получаешь преимущества автоматически сгенерированного boilerplate и при этом сохраняешь полный контроль над логикой инициализации.
Метод __post_init__ автоматически вызывается методом __init__, сгенерированным dataclass, только если он явно определен в классе.
Новый — ещё не проверен сообществом
Вы