我需要使用type.TypeVar构造泛型类,然后在此类中创建泛型类型的对象。
所以,我需要这样的东西
from typing import TypeVar, Generic
T = TypeVar('T')
class MyClass(Generic[T]):
def create(self) -> T:
created_obj = T() # Exception
return created_obj
my_list_class = MyClass[list]()
new_list = my_list_class.create()
my_dict_class = MyClass[dict]()
new_dict = my_dict_class.create()
因此,我希望它可以工作,但是却引发了异常,您无法调用TypeVar。
答案 0 :(得分:1)
请记住,类型提示在运行时将被完全忽略。因此,这意味着即使类型检查器推断出您的类的某个特定实例的类型为MyClass[List[Any]]
,在运行时它仍仅为MyClass
。特别是,每次T
都不会以某种方式自动替换为绑定类型。
相反,您需要在运行时自行提供所需的类型:
from typing import TypeVar, Generic, Type
T = TypeVar('T')
class MyClass(Generic[T]):
def __init__(self, type_factory: Type[T]) -> None:
self._type_factory = type_factory
def create(self) -> T:
return self._type_factory()
# Note: we no longer need to explicitly fill in the generic params, since the
# type checker now has enough info to infer this for us.
my_list_class = MyClass(list)
new_list = my_list_class.create()
my_dict_class = MyClass(dict)
new_dict = my_dict_class.create()
如果您希望代码更精确,通用性更好,可以将type_factory
的类型设为Callable[[], T]
而不是Type[T]
。