我正在尝试获取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
的真实类型?有可能吗?
答案 0 :(得分:0)
好吧,考虑到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
。