如何有选择地挑选类实例的变量?

Xin*_*Shi 0 python pickle

我有一个类实例:

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.matrixzeros(shape)在从pickle文件加载后重置为.

有更优雅的解决方案吗?就像transientJava中的关键字一样.

Mar*_*ers 6

使用钩子方法来限制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)