我有一个类实例:
class A:
def __init__(self,shape):
self.shape = shape
self.matrix = numpy.zeros(shape)
Run Code Online (Sandbox Code Playgroud)
我做了一些乘法self.matrix.当我腌制班级的实例时A,我不想self.matrix因为某些原因而腌制.
目前,我的解决方案是self.matrix = None在pickle之前设置self.matrix并zeros(shape)在从pickle文件加载后重置为.
有更优雅的解决方案吗?就像transientJava中的关键字一样.
使用钩子方法来限制pickle和unpickled的内容.
在这里,您可以使用__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)
Run Code Online (Sandbox Code Playgroud)
在__setstate__可以简化为:
def __setstate__(self, state):
self.__init__(*state)
Run Code Online (Sandbox Code Playgroud)
如果您__init__可以这种方式重复使用 在这种情况下,您也可以使用__getinitargs__而不是完全__getstate__删除__setstate__:
class A:
def __init__(self, shape):
self.shape = shape
self.matrix = numpy.zeros(shape)
def __getinitargs__(self):
return (self.shape,)
Run Code Online (Sandbox Code Playgroud)