Python Glossary English

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Сообщить о неточности