代码之家  ›  专栏  ›  技术社区  ›  Christian

如果父类实例和子类实例被pickle,如何在类层次结构中最好地pickle/unpickle

  •  4
  • Christian  · 技术社区  · 14 年前

    假设我有一个类a和一个派生自a的类B。我想pickle/unpickle类B的一个实例。A和B都定义了uuu getstate uuu/uu setstate uuu方法(假设A和B很复杂,这就需要使用u getstate uuu和uuu setstate)。B应该如何调用A的\uuuu getstate\uuu/\uuu setstate\uuu方法?我目前的方法,但可能不是“正确的”方法:

    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 回复  |  直到 14 年前
        1
  •  4
  •   unutbu    14 年前

    我会用 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)
    

    看到了吗 this article 有关方法解析顺序(MRO)和超级方法的更多信息。