我正在尝试创建一个可以使用类方法序列化和反序列化自身的对象,而不使用 return 语句(我不需要静态方法)。这是我的类(class)的一个概念,也是一个简单的用例:
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
但似乎没有任何效果,我想了解为什么.
提前致谢
最佳答案
这不起作用的原因是因为你不能分配给 self (或者更确切地说:这样做并不像你认为的那样)。如果您有兴趣了解实际发生的情况,请尝试为 self
分配一些奇怪的内容,例如self = "foobar"
(行为将保持不变)。
使反序列化
成为一个类方法并将其用作“构造函数”:
@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')
输出:
Serialized with value of: 2
Deserialized value inside deserialize function: 2
Deserialized value outside: 2
关于python - python中类方法的自解封,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52853754/