在类层次中如何最佳地进行序列化/反序列化,父类和子类实例都被序列化时
假设我有一个类A,还有一个从A派生出来的类B。我想要对类B的一个实例进行序列化和反序列化(也就是把它变成可以存储的格式,然后再变回来)。类A和类B都定义了__getstate__和__setstate__这两个方法(假设A和B比较复杂,所以需要用到这两个方法)。那么,类B应该怎么调用类A的__getstate__和__setstate__方法呢?我现在的做法,可能不是最“正确”的方式:
class A(object):
def __init__():
self.value=1
def __getstate__(self):
return (self.value)
def __setstate__(self, state):
(self.value) = state
class B(A):
def __init__():
self.anothervalue=2
def __getstate__(self):
return (A.__getstate__(self), self.anothervalue)
def __setstate__(self, state):
superstate, self.anothervalue = state
A.__setstate__(self, superstate)
1 个回答
4
我会使用 super(B,self)
来获取 B
的实例,以便调用 A
的方法:
import cPickle
class A(object):
def __init__(self):
self.value=1
def __getstate__(self):
return self.value
def __setstate__(self, state):
self.value = state
class B(A):
def __init__(self):
super(B,self).__init__()
self.anothervalue=2
def __getstate__(self):
return (super(B,self).__getstate__(), self.anothervalue)
def __setstate__(self, state):
superstate, self.anothervalue = state
super(B,self).__setstate__(superstate)
b=B()
with open('a','w') as f:
cPickle.dump(b,f)
with open('a','r') as f:
c=cPickle.load(f)
print(b.value)
print(b.anothervalue)
想了解更多关于方法解析顺序(MRO)和 super 的信息,可以查看 这篇文章。