gpt4 book ai didi

python - 如果 pickle 父类和子类实例,如何在类层次结构中最好地 pickle/取消 pickle

转载 作者:太空狗 更新时间:2023-10-30 03:07:43 30 4
gpt4 key购买 nike

假设我有一个 A 类和一个派生自 A 的 B 类。我想 pickle/unpickle B 类的一个实例。A 和 B 都定义了 __getstate__/__setstate__ 方法(​​假设 A 和 B 很复杂,这使得使用 __getstate__ 和 __setstate__ 成为必要)。 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)

最佳答案

我会使用 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) 和 super 的更多信息。

关于python - 如果 pickle 父类和子类实例,如何在类层次结构中最好地 pickle/取消 pickle ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3554310/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com