【发布时间】:2017-08-18 17:29:44
【问题描述】:
我在 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})
现在,您想知道NamedMutableSequence 和Document 是什么...
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) 时,我在getattr() 上收到了一个闪亮的attributes must be string 错误。
我仍然想保留基类,并且我仍然需要使其 JSON 可序列化。
我该如何自救?
【问题讨论】:
-
你为什么在这里使用
__slots__?这是一种优化,应该很少使用。 -
@DanielRoseman 好吧,既然您提到它,这可能是试图过度优化的反模式。但这已经发生了,我认为即使仅出于教育目的,仍然值得寻求解决方案。
标签: python json python-3.x inheritance flask