Укажите тип, который является подтипом

Мы указываем абстрактный класс, а также реализацию следующим образом:

from abc import ABC
class Base(ABC):
    ...

class Type1(Base):
    def __init__(self, var1: str):
        ...

то мы пытаемся использовать его таким образом

from typing import Dict
constructors: Dict[str, Base]= {'type1': Type1}

constructors['type1']("")  # Error here

Но мы получаем ошибку в нашей IDE, которая говорит, что Base не вызывается — и это правда. Как указать, что значения нашего словаря являются потомками класса Base, который может вызываться являются?

У меня не было проблем с запуском этого

Buckeye14Guy 28.05.2019 22:29

Вам нужен Dict[str, Type[Base]], поскольку constructors содержит типыBase (или подтипы), а не экземплярыBase или его подтипов.

chepner 28.05.2019 22:34

@chepner, можете ли вы добавить это в качестве ответа и, возможно, немного объяснить, что происходит?

Carlos Bribiescas 28.05.2019 22:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Аннотация Dict[str,Base] указывает на dict, который сопоставляет ключи str со значениями, которые являются экземпляры для Base (или его подклассов). Вы хотите, чтобы значения были самим классом Base (или одним из его подклассов), поэтому вместо этого вам нужно использовать Type[Base]. (Точно так же, как Base и др. являются экземплярами (мета)класса type.)

constructors: Dict[str, Type[Base]] = {'type1': Type1}
constructors['type1']("")

Другое дело, достаточно ли умна ваша IDE, чтобы определить, является ли constructors['type1'] абстрактным или нет.

Ваше решение работает для IntelliJ. В моей версии IntelliJ вызывал у меня смех. Спасибо!

Carlos Bribiescas 28.05.2019 23:32

Другие вопросы по теме