Задать вопрос
@pakhem
Изучаю python

Какую аннотацию использовать, для описания дочерних классов?

from typing import Dict

class Parent:
    def __int__(self):
        pass

class Child_1(Parent):
    def __int__(self):
        pass

class Child_2(Parent):
    def __int__(self):
        pass

some_var: Dict[str, XXX] = {'некая информация' : Child_1,
                           'некая информация' : Child_2}

Какая правильная аннотация, должна быть вместо "ХХХ" чтобы значением словаря могли быть любые классы наследники, родительского класса Parent?
  • Вопрос задан
  • 135 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@7GR
Уже, наверное, не актуально. Но, видимо: TypeVar
https://proproprogs.ru/python_base/python3-annotac...
Давайте теперь воспользуемся этой функцией. Если ее вызвать так:

geom = factory_point(Geom)
point = factory_point(Point2D)
то с аннотациями никаких конфликтов не будет. Но, если мы дополнительно аннотируем и переменные geom и point соответствующими типами:

geom: Geom = factory_point(Geom)
point: Point2D = factory_point(Point2D)
то во второй строчке появится подсветка кода. Очевидно это из-за того, что мы явно указываем ожидаемый тип Point2D, а в определении функции прописан тип Geom. И, так как Geom – базовый класса для Point2D, то возникает конфликт аннотаций.

Для исправления таких ситуаций в Python можно описывать некие общие типы с помощью класса TypeVar. Например:

T = TypeVar("T", bound=Geom)
Мы здесь объявили универсальный тип с именем T и сказали, что он должен быть или классом Geom или любым его дочерним классом. Далее, в самой функции, достаточно прописать этот тип:

def factory_point(cls_geom: Type[T]) -> T:
return cls_geom()
и он будет автоматически вычисляться при вызове функции. Когда передается класс Geom, то T будет соответствовать этому типу, а когда передается Point2D – то тип T будет Point2D. И так далее. Вот смысл универсальных типов при формировании аннотаций.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы