有没有办法通过自检来获取类构造函数参数?

时间:2017-07-13 23:03:02

标签: python json serialization constructor

我有一组要与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__中有任何有用的工作,我就失去了。 (例如参数的类型/范围检查)。
  • 就我而言,这些类在构建后不会发生变化(它们定义了许多有用的方法,并且有一些缓存)。因此,如果我只能从字典中提取构造函数参数,我就会做得很好。有没有办法做到不涉及重复所有构造函数参数?

1 个答案:

答案 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)