我想获取对象属性的类型提示。我只能得到该类的提示,而不能得到它的实例。
我尝试使用here中的foo_instance.__class__
,但这仅显示类变量。
因此在示例中,如何获得bar
的类型提示?
class foo:
var: int = 42
def __init__(self):
self.bar: int = 2
print(get_type_hints(foo)) # returns {'var': <class 'int'>}
答案 0 :(得分:1)
提示仅在类级别存在-在创建实例时,其属性的类型将是为其分配的任何值的类型。您可以使用内置的type()
函数的第一种形式来获取任何实例属性的类型,例如type(foo_instance.var)
。
答案 1 :(得分:0)
此信息不是evaluated,仅存在于源代码中。 如果必须获取此信息,则可以使用ast模块并在有权访问源代码的情况下自己从源代码中提取information。
您还应该问自己是否需要此信息,因为在大多数情况下,重新评估源代码会很费力。
答案 2 :(得分:0)
也许这是黑客,您必须是实例的创建者,但是在某些情况下,使用数据类将为您提供所需的东西;
Python 3.7 +
@dataclass
class Foo:
bar: str = 2
if __name__ == '__main__':
f = Foo()
print(f.bar)
print(get_type_hints(f))
2
{'bar': <class 'str'>}
答案 3 :(得分:0)
我只是遇到了同样的问题。 python doc尚不清楚,因为该示例使用的是现在正式称为数据类的数据。
Student(NamedTuple):
name: Annotated[str, 'some marker']
get_type_hints(Student) == {'name': str}
get_type_hints(Student, include_extras=False) == {'name': str}
get_type_hints(Student, include_extras=True) == {
'name': Annotated[str, 'some marker']
}
给人的印象是get_type_hints()
直接在课堂上工作。原来get_type_hints()
返回的提示基于函数,而不是基于类。这样我们既可以在 if 中使用它。普通类显然不会在其声明中实例化,它没有在__init__()
方法中设置尚未被调用的任何变量。如果我们希望有可能从类范围的变量中获取类型提示,那就不是那样。
因此,您可以在__init__()
上调用它,也就是说,虽然变量是通过参数传递的(是的,我在您的示例中没有看到它,但是可能会帮助其他人,因为我在搜索的几个小时中都没有看到它);
class foo:
var: int = 42
def __init__(self, bar: int = 2):
self.bar = int
print(get_type_hints(foo.__init__))
最后,对于您的确切示例,我相信您有两个选择。您可以实例化一个临时对象,并在逻辑允许后立即使用del
对其进行清理。或将变量声明为具有默认值或不具有默认值的类,以便您可以使用get_type_hints()
来获取它们,并在以后的实例化中对其进行分配。