如何从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.
相关产品推荐
相关产品推荐

