Присвойте тип родительского объекта дочернему объекту в Python - PullRequest
0 голосов
/ 12 марта 2020

Я опытный Java разработчик, который недавно поднял Python. Несмотря на то, что я попробовал кое-что, я не смог найти в Интернете решения для следующей проблемы:

class A()
    def __init__(self, **data: Any) -> None:
        self.a1 = data['a1']
        self.a2 = data['a2']

    a1: str
    a2: str


class B(A)
    def __init__(self, **data: Any) -> None:
        super().__init__(**data)
        self.b1 = data['b1']

    b1: str

def map_to_a(some_data) -> A:
    return A(a1=some_data['a1'], a2=some_data['a2'])


def map_to_b(some_data) -> B:
    b: B = map_to_a(some_data)
    b.b1 = some_data['b1'] # ==> ERROR happens here since b is of type A because map_to_a returns A so b
    return b

Результат:

ValueError: "A" object has no field "b1"

Как я могу решить это легко? Есть ли способ, может быть, может быть, бросить мой A на объект B? Я не могу найти решение онлайн.

Причина, по которой я так хочу, состоит в том, что мне не нужно отображать все мои поля типа объекта дважды (один раз в map_to_a и один раз в map_to_b).

1 Ответ

0 голосов
/ 12 марта 2020

Я не думаю, что здесь есть тривиальный метод приведения. Вы можете поиграть с __class__, но это не рекомендуется. Вообще говоря, вам нужно просто создать некоторый инициализатор или метод, основанный на A, чтобы создать новый B, а не какой-нибудь приведение существующего объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...