在类层次中如何最佳地进行序列化/反序列化,父类和子类实例都被序列化时

4 投票
1 回答
1439 浏览
提问于 2025-04-16 03:12

假设我有一个类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 的信息,可以查看 这篇文章

撰写回答