我可以创建泛型类吗?

时间:2019-10-15 13:26:47

标签: python typing

我需要使用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。

1 个答案:

答案 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]