【问题标题】:Python - Saving Entire Class Object Except For A Large AttributePython - 保存除大属性外的整个类对象
【发布时间】:2014-08-13 16:48:08
【问题描述】:

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

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。

任何建议

【问题讨论】:

  • 您是否在使用名为deep 的模块? PyPI 上的那个似乎没有copy()。还是您使用copy.deepcopy()
  • 哎呀,这是一个错字,意思是 copy.deepcopy()

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


【解决方案1】:

你可以使用字典推导和__getstate__ / __setstate__ 来构建一个新字典来腌制,省略大属性:

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的实现细节;它只是腌制对象,而对象本身会做正确的事情。

【讨论】:

    猜你喜欢
    • 2016-06-17
    • 2020-08-01
    • 2019-09-13
    • 2015-07-31
    • 2020-10-27
    • 2012-09-22
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多