You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python get_type_hints无法返回子类dataclass的父类注解

如何获取继承父类的数据类的所有字段?

你的情况是正常的,没有操作错误

__annotations__是类的专属属性,只会存储当前类直接定义的注解,父类的注解不会自动合并到子类的__annotations__中;get_type_hints()默认处理实例对应的类,同样只会返回当前类的类型提示,不会自动包含父类的内容,所以你看到的输出是符合Python默认行为的。

fields()是官方推荐的方法,但不是唯一方法

dataclasses.fields()会自动遍历类的继承链(MRO),收集所有数据类字段,这是官方为处理继承场景提供的便捷工具,用它来获取所有字段是最稳妥的方式。

如果需要其他实现方式,也可以手动遍历类的方法解析顺序来合并字段:

  1. 获取所有类型提示的工具函数:
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'>}
  1. 仅获取字段名列表的简化实现:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 23:47:31