Python get_type_hints无法返回子类dataclass的父类注解
如何获取继承父类的数据类的所有字段?
你的情况是正常的,没有操作错误
__annotations__是类的专属属性,只会存储当前类直接定义的注解,父类的注解不会自动合并到子类的__annotations__中;get_type_hints()默认处理实例对应的类,同样只会返回当前类的类型提示,不会自动包含父类的内容,所以你看到的输出是符合Python默认行为的。
fields()是官方推荐的方法,但不是唯一方法
dataclasses.fields()会自动遍历类的继承链(MRO),收集所有数据类字段,这是官方为处理继承场景提供的便捷工具,用它来获取所有字段是最稳妥的方式。
如果需要其他实现方式,也可以手动遍历类的方法解析顺序来合并字段:
- 获取所有类型提示的工具函数:
from dataclasses import is_dataclass from typing import get_type_hints, Dict def get_all_type_hints(obj) -> Dict[str, type]: all_hints = {} # 遍历类的MRO,只处理数据类 for cls in type(obj).__mro__: if is_dataclass(cls): all_hints.update(get_type_hints(cls)) return all_hints # 测试 print(get_all_type_hints(b)) # 输出: {'a': <class 'int'>, 'b': <class 'int'>}
- 仅获取字段名列表的简化实现:
from dataclasses import is_dataclass def get_all_dataclass_field_names(obj): field_names = [] for cls in type(obj).__mro__: if is_dataclass(cls): field_names.extend(cls.__annotations__.keys()) return field_names # 测试 print(get_all_dataclass_field_names(b)) # 输出: ['a', 'b']
内容的提问来源于stack exchange,提问作者roschach
相关产品推荐
相关产品推荐

