将具有 __slots__ 的子类转换为 JSON



我是一个完全的Python菜鸟,只是无法控制自己,但又做了一次,梦想着我无法实现的事情。

我想有一个类,它可以这样实例化:

my_class = MyClass(**params)

并按原样食用,在烧瓶中:

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__)

诚然,我只是将某人的解决方案复制到这个基类的可变命名元组,并修复了__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().

我仍然想保留基类,我仍然需要使其 JSON 可序列化。

我怎样才能拯救自己?

我终于找到了答案,解决方案是从另一个堆栈溢出帖子中找到的(如何将带有插槽的 python 类转换为字典?

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

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

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

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

最新更新