Python - 保存整个类对象,除了大属性

时间:2014-08-13 16:48:08

标签: python python-2.7 serialization python-3.x save

我有一个我想保存的对象,但其中一个属性非常大,不需要保存。如何保存除一个属性之外的对象。以下是我目前的解决方案。

class Example(object):
    def __init__(self):
        self.attribute_one = 1
        self.attribute_two = 'blah blah'
        ...
        self.attribute_large = very_large_object

save_this_except_attribute_large = Example() 

一种可能的解决方案是

def save_example(example):
    save_this = copy.deepcopy(example)
    save_this.attribute_large = None
    pickle.dump(save_this,open('save_path','w'))

除了上面的解决方案不是内存效率,因为在我们将其中一个设置为None之前,我们将在内存中有2个attribute_large。

任何建议

1 个答案:

答案 0 :(得分:4)

你可以使用dict理解和__getstate__ / __setstate__来构建一个新的dict来进行pickle,省去了大的属性:

class Example(object):
    def __init__(self):
        self.attribute_one = 1
        self.attribute_two = 'blah blah'
        ...
        self.attribute_large = very_large_object

    def __getstate__(self):
        d = self.__dict__
        self_dict = {k : d[k] for k in d if k != 'attribute_large'}
        return self_dict

    def __setstate__(self, state):
        self.__dict__ = state

使用__getstate__ / __setstate__可以让实际进行酸洗的代码不必担心Example的实施细节;它只是腌制物体,而物体本身也是正确的。