在Python类方法中实现自动拆包解压。

9 浏览
0 Comments

在Python类方法中实现自动拆包解压。

我正在尝试创建一个对象,该对象可以使用类方法进行序列化和反序列化,而无需使用返回语句(我不想使用静态方法)。 这是我的类的概念和一个天真的用例:

import pickle
class A:
    def __init__(self):
        self.x = 0
    def add(self):
        self.x += 1
    def serialize(self, filename):
        """Simple object serialization given a filename"""
        with open(filename, 'wb') as f:
            pickle.dump(self, f)
            print("Serialized with value of: %d" % (self.x))
    def deserialize(self, filename):
        """Simple object deserialization given a filename"""
        with open(filename, 'rb') as f:
            print("self.x before load (inside deserialize): %d" % (self.x))
            self = pickle.load(f)
            print("Deserialized value inside deserialize function: %d" % (self.x))
a1 = A()
a2 = A()
a1.add()
a1.add()
a1.serialize('a.pkl')
a2.deserialize('a.pkl')
print("Deserialized value outside: %d" % (a2.x))

然而,一旦我离开反序列化方法,self(在这种情况下,实例a2)就不能保持它的值。

运行时的输出:

>> Serialized with value of: 2
>> self.x before load (inside deserialize): 0
>> Deserialized value inside deserialize function: 2
>> Deserialized value outside: 0

为什么会这样? 我也尝试过在函数deserialize中的pickle.load后面使用deepcopy,但似乎没有什么作用,我想了解原因。

提前致谢

admin 更改状态以发布 2023年5月23日
0
0 Comments

抱歉回复晚了。\nPickle会将对象压成字典。\n以下是修复方法:\n

    def serialize(self, filename):
        """Simple object serialization given a filename"""
        with open(filename, 'wb') as f:
            pickle.dump(self.__dict__, f)
            print("Serialized with value of: %d" % (self.x))
    def deserialize(self, filename):
        """Simple object deserialization given a filename"""
        with open(filename, 'rb') as f:
            print("self.x before load (inside deserialize): %d" % (self.x))
            self.__dict__ = pickle.load(f)
            print("Deserialized value inside deserialize function: %d" % (self.x))

0
0 Comments

这个方法不可行的原因在于你不能给self赋值(或者说:这样做并不会达到你想要的效果)。如果你想知道实际上会发生什么,请尝试将一些奇怪的东西赋给self,例如:self = "foobar" (行为不会改变)。


deserialize设为类方法并将其用作“构造函数”:

@classmethod
def deserialize(cls, filename):
    """Simple object deserialization given a filename"""
    with open(filename, 'rb') as f:
        obj = pickle.load(f)
        print("Deserialized value inside deserialize function: %d" % (obj.x))
        return obj

然后像这样使用它:

a2 = A.deserialize('a.pkl')


输出:

使用值为2进行序列化
deserialize函数内的反序列化值:2
外部反序列化值:2

0