Как преобразовать классы данных в Python, которые наследуются друг от друга?

Как правильно конвертировать классы данных в Python, которые наследуются друг от друга (без повторяющегося кода)?

Пример:

from dataclasses import dataclass

@dataclass
class Parent:
    p1: int
    # …

@dataclass
class Child(Parent):
    c1: int
    # …

Моя попытка:

# Fail: How to call the parent constructor (like in C++)?
def make_child(parent: Parent, c1: int, …) -> Child:
    return Child(
        p1=parent.p1,
        # …
        c1=c1,
        # …
    )

# Fail: How to implicitly cast to parent (like in C++)?
def get_parent(child: Child) -> Parent:
    return Parent(
        p1=child.p1,
        # …
    )

Я знаю, что это было бы легко с композицией вместо наследования, но это не мой вопрос.


person user2394284    schedule 09.02.2021    source источник
comment
Как эти примеры терпят неудачу? Мне они нравятся.   -  person tzaman    schedule 09.02.2021
comment
то, что вы хотите, невозможно в общем смысле, поскольку классы данных могут иметь параметры только для инициализации. Из-за этого при передаче экземпляра Parent в конструктор Child эта информация будет отсутствовать. Для простых случаев без InitVars вы можете использовать этот шаблон: stackoverflow.com/questions/54824893/, а также изменить подпись и вызвать что-то например def from_instance(cls, instance, **kwargs): return cls(**dataclasses.asdict(instance), **kwargs) для добавления настраиваемых дочерних атрибутов.   -  person Arne    schedule 10.02.2021