我有一组要与JSON和mongodb数据库进行序列化的类。我认为最有效的方法是编写序列化为dicts的方法,然后使用内置方法来存储/从存储中获取。 ( Q1:这个结论实际上是有效的,还是有更好的方法?)
因此,要将我的类的实例导出到dict,我可以使用self。 dict 。在我的情况下,这些类是嵌套的,所以它必须是递归的,很好。现在我想把它读回去......但是如果我的班级有一个非平凡的构造函数,那么现在我就陷入了困境。考虑:
class MyClass(object):
def __init__(self, name, value=None):
self.name = name
self._value = value
@property
def value(self):
return self._value
a = MyClass('spam', 42)
d = a.__dict__ #has {'name':'spam', '_value':42}
#now how to unserialize?
b = MyClass(**d) #nope, because '_value' is not a valid argument
c = MyClass(); c.__dict__.update(d) #nope, can't construct 'empty' MyClass
我不想写一个忽略未知参数的构造函数,因为我讨厌浪费时间试图弄清楚为什么一个类忽略了一些参数来发现名字中有一个拼写错误。而且我不想删除所需的参数,因为这可能会在其他地方引起问题。
那么如何解决我为自己制造的这些烂摊子呢?
__init__
中有任何有用的工作,我就失去了。 (例如参数的类型/范围检查)。 答案 0 :(得分:0)
我不知道它是否只是一个微不足道的例子,但我无法看到属性value
的价值(没有双关语意)。如果您直接从__init__
分配值参数,我的意思是。在这种情况下,只使用一个简单的属性就可以解决您的问题。
但是如果由于某种原因你真的需要一个属性,只需删除密钥中的破折号:
class MyClass(object):
Pdef __init__(self, name, value=None):
self.name = name
self._value = value
@property
def value(self):
return self._value
a = MyClass('spam', 42)
d = {k.strip('_'): v for k, v in a.__dict__.items()}
b = MyClass(**d)