Мы указываем абстрактный класс, а также реализацию следующим образом:
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
, который может вызываться являются?
Вам нужен Dict[str, Type[Base]]
, поскольку constructors
содержит типыBase
(или подтипы), а не экземплярыBase
или его подтипов.
@chepner, можете ли вы добавить это в качестве ответа и, возможно, немного объяснить, что происходит?
Аннотация 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 вызывал у меня смех. Спасибо!
У меня не было проблем с запуском этого