在我的类实例化期间,我初始化了一些不可picklable的字段。因此,为了能够正确地(取消)pickling我的类,我希望在取消pickling时调用我的init方法。这似乎是旧式类的工作方式。
对于新式类,我需要使用
如果不是因为
对于新式类,我需要使用
__new__
和__getnewargs__
。以下是我的做法:import cPickle
class Blubb(object):
def __init__(self, value):
self.value = value
class Bla(Blubb):
def __new__(cls, value):
instance = super(Bla, cls).__new__(cls)
instance.__init__(value)
return instance
def __getnewargs__(self):
return self.value,
def __getstate__(self):
return {}
def __setstate__(self, dct):
pass
x = Bla(2)
print x.value
pickled = cPickle.dumps(x, 2)
x_ = cPickle.loads(pickled)
assert x_.value == 2
如果不是因为
obj = C.__new__(C, *args)
出现了 **kwargs
,这就没问题了。所以在我的 __new__
和 __init__
方法中只能使用非关键字参数。是否有人知道解决方法?这真的很不方便。