为什么json.dumps序列化Python对象时会忽略类全局初始化的变量?
现象原因解释
Python 的类属性和实例属性是独立存储的,你用到的实例__dict__只存储实例自身独有的属性,不会包含继承自类的公共属性:
- 你在类定义中声明的
name = "Test"属于TestObject的类公共属性,存储在类本身的属性字典TestObject.__dict__里,所有未单独赋值name的实例都会共享这个值。你直接访问tObj.name时,Python 会按「实例属性→类属性→父类属性」的顺序向上查找,所以能正常读到值,但这个属性并不属于实例本身,自然不会出现在tObj.__dict__中,序列化结果就是空对象。 - 当你执行
tObj.name = "Test"赋值操作时,相当于给当前实例单独创建了一个同名的独有属性,这个属性会被写入实例的__dict__中,序列化的时候就能正常输出{"name": "Test"}。
如果需要同时序列化类属性和实例属性,可以自己拼接属性字典,示例如下:
# 过滤掉类的魔法属性,合并类属性和实例属性后序列化 class_attrs = {k:v for k,v in TestObject.__dict__.items() if not k.startswith('_')} instance_attrs = tObj.__dict__ out = json.dumps(class_attrs | instance_attrs)
内容的提问来源于stack exchange,提问作者lehli
相关产品推荐
相关产品推荐

