我想获取对象属性的类型提示。我只能得到类的提示,而不是它的实例。
我试过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'>}
我想获取对象属性的类型提示。我只能得到类的提示,而不是它的实例。
我试过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'>}
我只是有同样的问题。python 文档不是很清楚,因为这个例子是用现在正式称为数据类的东西制作的。
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()基于函数而不是类返回提示。这样,如果我们知道的话,它可以与两者一起使用。一个普通的类显然没有在它的声明中被实例化,它没有在__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()稍后在实例化中获取并分配它们。
也许这是一个 hack,你必须是你的实例的创建者,但在某些情况下,使用数据类可以得到你想要的;
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'>}
提示仅存在于类级别——在创建实例时,其属性的类型将是已分配给它们的任何值的类型。您可以使用内置type()函数的第一种形式获取任何实例属性的类型,例如type(foo_instance.var).