如何获取Generic [T]子类的实际声明类型的成员变量

问题描述 投票:1回答:1

我试图获得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类型吗?可能吗?

python python-3.x typing
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.