如何腌制自己的一部分

How to pickle PART of yourself

所以,我正在从 class 中挑选一个对象(参见 How to pickle yourself ):

    def save(self, path):
        f = open(path, 'wb')
        pickle.dump(self, f)
        f.close()


    @classmethod
    def load(cls, path):
        f = open(path, 'rb')
        obj = pickle.load(f)
        f.close()
        return obj

效果很好。但是在大多数情况下我不想腌制一个很大的属性。我怎样才能做到这一点?应该看起来像这样:

        def save(self, path, without_attr_x =True):
            f = open(path, 'wb')
            if(without_attr_x):
                #somehow remove attr_x from the pickling
                # I could do self.attr_x = None but this deletes attr_x from the running instance as well
            pickle.dump(self, f)
            f.close()

您必须在酸洗之前从 class/instance 中删除此属性。

您可以将其分配给 external/global 变量,在 class/instance 中将其删除,pickle class/instance,然后从 external/global 变量再次分配。

像这样:

# ... external variables ...

attr_x = None

# ... class ...

def save(self, path, without_attr_x=True):
    global attr_x
    
    f = open(path, 'wb')
    
    if without_attr_x:
        # assign to external variable
        attr_x = self.attr_x
        # remove value
        self.attr_x = None
        
    pickle.dump(self, f)

    if without_attr_x:
        # assign back from external variable
        self.attr_x = attr_x

    f.close()