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

如何从Python dataclass中获取类属性及其对应类型标注?

读取dataclass定义属性与对应类型的实现方案

dataclass 模块提供了原生的字段元数据接口,不需要手动遍历类的命名空间、手动解析注解,直接调用内置的dataclasses.fields()即可实现需求,该接口返回的字段对象天然包含属性名、类型注解两类核心信息,和预期效果完全匹配。

可直接运行的完整实现

from dataclasses import dataclass, fields
from typing import get_type_hints, Any


def get_attributes(cls: type) -> list[Any]:
    # 配合get_type_hints可自动解析字符串形式的前向引用类型
    type_map = get_type_hints(cls)
    field_list = []
    for f in fields(cls):
        # 构造带有name、type属性的元数据对象,匹配预期的调用逻辑
        field_meta = type(
            "AttrMeta",
            (),
            {"name": f.name, "type": type_map[f.name]}
        )
        field_list.append(field_meta)
    return field_list


@dataclass
class HelloWorld:
    name: str = 'Earth'
    is_planet: bool = True
    radius: int = 6371


if __name__ == '__main__':
    attrs = get_attributes(HelloWorld)
    for attr in attrs:
        print(attr.name, attr.type)

运行上述代码的输出为:

name <class 'str'>
is_planet <class 'bool'>
radius <class 'int'>

关键注意事项

  • 该方法只会返回被@dataclass装饰器正式识别的字段,不会混入类中定义的普通方法、无类型注解的类变量、非dataclass管理的私有属性,完全匹配dataclass的设计边界
  • 接口会自动识别类继承链上所有父级dataclass定义的字段,无需手动遍历类的__bases__继承关系,适配多继承、多层继承的场景
  • 不建议直接遍历类的__annotations__字典实现需求:该方式会读取所有带注解的内容,包括非dataclass管理的注解,且遇到字符串形式的前向引用(比如标注friend: "HelloWorld")时,拿到的是原始字符串而非可解析的类型对象,和实际类型语义不符
  • 内置的Field对象还附带了默认值、默认值工厂、字段元信息等额外属性,可直接通过返回的字段对象读取,无需额外从类的命名空间中查找

内容的提问来源于stack exchange,提问作者Mr. B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 09:27:01