То, что я знаю
Класс данных Python допускает наследование либо с классом данных, либо с классом.В лучшей практике (а также в некоторых языках), когда мы делаем наследование, инициализация должна быть вызвана первой.В Python это:
def __init__(self):
super().__init__()
...
Что я делаю
Поскольку класс данных был представлен в Python 3.7, я подумываю заменить весь мой класс на класс данных.С dataclass одна из его целей - генерировать __init__
для вас.Это не очень хорошо, когда класс данных должен наследовать класс - например:
class Base:
def __init__(self):
self.a = 1
@dataclass
class Child(Base):
a:int
def __post_init__(self):
super().__init__()
В чем моя проблема
Проблема в том, что мы должны поместить вызов супер инициализации внутри __post_init__
который на самом деле называется после класса данных init .
Недостатком является то, что мы теряем договорный договор, а беспорядок инициализации приводит к тому, что мы не можем переопределить атрибуты суперклассов.
Это можно решить с помощью концепции __pre_init__
.Я прочитал документ и не вижу там ничего общего с этой концепцией.Я что-то упустил?