如何将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}}
函数逻辑说明
- 先遍历对象所属类的
__dict__,筛选出非内置、非方法的类属性加入结果 - 再遍历对象自身的
__dict__,处理实例属性:- 如果属性值是自定义类的实例,递归调用转换函数
- 如果是基础数据类型(int、str等)或容器类型,直接保留原值
内容的提问来源于stack exchange,提问作者aeiou
相关产品推荐
相关产品推荐

