我有一个类实例:
class A:
def __init__(self,shape):
self.shape = shape
self.matrix = numpy.zeros(shape)
我在self.matrix
上进行了一些乘法运算。当我在挑选课程A
的实例时,我不想因某种原因挑选self.matrix
。
目前,我的解决方案是在pickle之前设置self.matrix = None
,并在从pickle文件加载后将self.matrix
重置为zeros(shape)
。
有更优雅的解决方案吗?与Java中的transient
关键字一样。
答案 0 :(得分:6)
使用hook methods来限制腌制的内容和未上腌的内容。
在这里,您可以使用__getstate__
和相应的__setstate__
方法:
class A:
def __init__(self, shape):
self.shape = shape
self.matrix = numpy.zeros(shape)
def __getstate__(self):
return (self.shape,)
def __setstate__(self, state):
self.shape, = state
self.matrix = numpy.zeros(self.shape)
__setstate__
可以简化为:
def __setstate__(self, state):
self.__init__(*state)
如果您的__init__
可以这种方式重复使用。在这种情况下,您也可以使用__getinitargs__
代替__getstate__
并完全删除__setstate__
:
class A:
def __init__(self, shape):
self.shape = shape
self.matrix = numpy.zeros(shape)
def __getinitargs__(self):
return (self.shape,)