将带有__slots__的子类转换为json

时间:2017-08-18 17:29:45

标签: python json python-3.x inheritance flask

我是Python中的一个总菜鸟,只是无法帮助自己,但又做了一次并梦想着一些我无法实现的目标。

我想要一个可以实例化的类:

my_class = MyClass(**params)

并在Flask中消费:

jsonify(my_class)

预期结果将是JSON:

{ "key" : "value", ... }

现在,MyClass的实现是,

class MyClas(NamedMutableSequence, Document):
    __slots__ = (
        'key_1',
        'key_2',
        'key_3'
    )

def __init__(self, **params):
    NamedMutableSequence.__init__(self, **params)
    Document.__init__(self, 'myclass')

def save(self):
    self._db_col.update({'key_1': self.key_1}, {'key_2': self.key_2, 'key_3': self.key_3})

到目前为止,您想知道NamedMutableSequenceDocument是什么......

    class NamedMutableSequence(Sequence):
        ___slots__ = ()

        def __init__(self, *positional_values, **keyword_values):
            subclass_propeties = self.__slots__
            for key in subclass_propeties:
                setattr(self, key, keyword_values.get(key))

            if positional_values:
                for key, value in zip(subclass_propeties, positional_values):
                    setattr(self, key, value)

        def __str__(self):
            values = ', '.join('%s=%r' % (key, getattr(self, key)) for key in self.__slots__)
            return '%s(%s)' % (clsname, values)

        __repr__ = __str__

        def __getitem__(self, item):
            return getattr(self, item)

        def __setitem__(self, item, value):
            return setattr(self, item, value)

        def __len__(self):
            return len(self.__slots__)

不可否认,我只是将某人的解决方案复制到这个基类的一个可变的namedtuple并修复了__getitem__& __setitem__允许my_class.key_1 = 'some value'

class Document():
    __slots__ = ('_db_col')

    def __init__(self, collection):
        self._db_col = mongo_db[collection]

这就是我在尝试使用基类时所用的内容,我将在我的模型类中使用它来进行数据库连接。

在我看来,这就是它开始的地方我自己太过分了,只是制造了一团糟。因为无论我尝试什么,我都不能停止提升TypeError: {string value of my_class} is not JSON serializable

更糟糕的是,当我尝试dict(my_class)时,attributes must be string上出现了一个闪亮的getattr()错误。

我仍然希望保留基类,我仍然需要使它可以序列化。

我怎样才能救自己?

1 个答案:

答案 0 :(得分:0)

我最终找到了答案,并且从另一个stackoverflow帖子(How can I convert python class with slots to dictionary?)找到了解决方案

我所做的只是在NamedMutableSequence上添加另一种方法:

def json(self):
    return {key : getattr(self, key, None) for key in self.__slots__}

并在我需要JSON可解析字典时调用它,如下:

my_class = MyClass(**params)
jsonify(my_class.json())