从继承类序列化Python父类到JSON - 可行还是愚蠢?

0 投票
1 回答
2639 浏览
提问于 2025-04-17 23:39

我知道关于JSON序列化的问题很多,但我还是没搞明白。

给定以下这个类:

import json

class BaseMongoObject(object):
    def __init__(self):
        pass

    def jsonify(self):
        return json.dumps(self, default=lambda o: o.__dict)

还有这个派生类:

from assetfacts import AssetFacts
from bmo import BaseMongoObject

class Asset(BaseMongoObject):
    def __init__(self):
        BaseMongoObject.__init__(self)
        self.facts = AssetFacts()
        self.serial = None

我试着用以下测试代码调用 asset.jsonify()

from asset import Asset

def test_me():
    a = Asset()
    a.serial = '123asdf'

    print a.jsonify()


if __name__ == '__main__':
    test_me()

结果却是这样:

    Traceback (most recent call last):
  File "../bin/test.py", line 17, in <module>
    test_me()
  File "../bin/test.py", line 13, in test_me
    print a.jsonify()
  File "/Users/vlazarenko/MP/ac/lib/bmo.py", line 8, in jsonify
    return json.dumps(self, default=lambda o: o.__dict)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 250, in dumps
    sort_keys=sort_keys, **kw).encode(obj)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
  File "/Users/vlazarenko/MP/ac/lib/bmo.py", line 8, in <lambda>
    return json.dumps(self, default=lambda o: o.__dict)
AttributeError: 'Asset' object has no attribute '_BaseMongoObject__dict'

我到底哪里搞错了呢?理想情况下,我不想被继承层级的数量困扰,只想从最上面开始全部序列化。

1 个回答

1

你想把 self.__dict__ 转换成 JSON 格式:

def jsonify(self):
    return json.dumps(self, default=lambda o: o.__dict__)

那些只以双下划线 开头 的名字会被处理一下,以防止在子类中被意外覆盖,.__dict 被改写成了 ._BaseMongoObject__dict

撰写回答