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

如何将Python类属性与实例属性转换为嵌套字典?

问题:将类属性与实例属性转换为嵌套字典

我把配置信息存储在多个类属性及一个引用这些属性的主类中,示例代码如下:

class A:
    a = 1

class B:
    b = 2   
    def __init__(self):
        self.a_ = A()

x = B()

我希望将所有类属性与实例属性转换为如下格式的嵌套字典:

{'b': 2, 'a_': {'a': 1}}

我了解__dict__无法访问类属性,测试结果如下:

x.__dict__  # {'a_': <__main__.A at 0x1b888d9e530>}
x.__dict__['a_'].__dict__  # {} -- 为何不是{'a': 1}?

我尝试了以下类方法,但结果仍不符合预期:

@classmethod
def to_dict(cls):
    return vars(cls)

@classmethod
def to_dict2(cls):
    return cls.__dict__

解答

为什么x.__dict__['a_'].__dict__是空的?

a是类A的类属性,类属性存储在类本身的__dict__(即A.__dict__)中,而实例的__dict__只保存该实例自身定义的属性。你创建的A实例没有任何实例属性,所以它的__dict__是空的。

解决方案:递归转换函数

要同时收集类属性和实例属性,并实现嵌套转换,可以写一个通用的递归转换函数:

def obj_to_dict(obj):
    result = {}
    # 收集类属性:排除内置属性和可调用的方法
    for attr_name, attr_value in obj.__class__.__dict__.items():
        if not attr_name.startswith('__') and not callable(attr_value):
            result[attr_name] = attr_value
    # 收集实例属性:对自定义类实例递归转换
    for attr_name, attr_value in obj.__dict__.items():
        # 判断是否为需要递归转换的自定义对象
        is_custom_obj = hasattr(attr_value, '__class__') and not isinstance(attr_value, (int, str, float, bool, list, dict, tuple, set))
        if is_custom_obj:
            result[attr_name] = obj_to_dict(attr_value)
        else:
            result[attr_name] = attr_value
    return result

测试验证

调用函数转换实例x:

x = B()
print(obj_to_dict(x))  # 输出: {'b': 2, 'a_': {'a': 1}}

函数逻辑说明

  1. 先遍历对象所属类的__dict__,筛选出非内置、非方法的类属性加入结果
  2. 再遍历对象自身的__dict__,处理实例属性:
    • 如果属性值是自定义类的实例,递归调用转换函数
    • 如果是基础数据类型(int、str等)或容器类型,直接保留原值

内容的提问来源于stack exchange,提问作者aeiou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:23:27