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

时间:2014-11-10 19:15:37

标签: python pickle

我有一个类实例:

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关键字一样。

1 个答案:

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