在Python类方法中实现自动拆包解压。
在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日
抱歉回复晚了。\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))
这个方法不可行的原因在于你不能给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