Python 3.7+dataclassesпонятие
__post_init__
инициализация
Метод __post_init__ вызывается автоматически после __init__ для дополнительной валидации или обработки.
Синтаксис
def __post_init__(self): ...
Вызывается только тем __init__, который сгенерировал сам dataclass: с init=False или собственноручным __init__ его никто не позовёт. Под frozen=True обычное присваивание self.x = ... там падает с FrozenInstanceError, и приходится писать object.__setattr__(self, "x", ...). Сюда же приходят поля-InitVar — они не становятся атрибутами, а передаются в __post_init__ как аргументы, что и есть штатный способ протащить данные, нужные только для инициализации.
Примеры
from dataclasses import dataclass
@dataclass
class Circle:
radius: float
def __post_init__(self):
if self.radius < 0:
raise ValueError('radius < 0')
self.area = 3.14 * self.radius ** 2
c = Circle(3.0)
c.area # → 28.26
# Circle(-1) # → ValueError
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности