我试图获得Generic Type变量的真实类型。我尝试了很多方法,然而,它们都没有前途。
这是演示我的问题的最小代码:
from typing import *
T = TypeVar('T')
class G(Generic[T]):
x: T = None
class R(G[int]):
pass
我想在运行时获得真正的R.x
类型。我的第一次尝试是使用get_type_hints
。它给
{'x': ~T}
看起来不是很有用。
我也尝试过R.__orig_bases__
。它确实有一些东西:
(__main__.G[int],)
但是将基类类型参数与成员变量对齐太复杂了。
你们有办法在运行时获得真正的R.x
类型吗?可能吗?
好吧,鉴于R
特别继承了G[int]
,实际上没有必要在运行时获取内部类型:你知道它是特定的int,所以你可以在任何地方硬编码。
你也可以随时做type(instance_of_r.x)
。据推测,您定义R.__init__
的方式是保证x
使用正确类型的值进行实例化,因此您可以直接查询。
但是,如果您尝试使用G[...]
的多个子类,其中每个子类以不同的方式参数化G[...]
,您可能会修改G
的定义以坚持每个子类指定您要使用的类型。例如,也许你可以大致这样做:
from typing import *
T = TypeVar('T')
class G(Generic[T]):
x_type: ClassVar[Type[T]]
x: T = None
class R(G[int]):
x_type = int
class S(G[str]):
x_type = str
然后,你可以做instance_of_g.x_type
以获得适当的类型。
您也许可以将这两个答案结合起来 - 例如,可能设置G
的构造函数,以便它在type(...)
给出的任何值上调用x
。