我有类A。它有一个接受参数的构造函数。它使用__getstate__
和__setstate__
实现自定义酸洗。这个很好用。在
我有另一个类B,它包含一个类A的实例作为属性。类B还实现了__getstate__
和{
让类B的__getstate__
调用类A很容易,但是pickle
对它一无所知,当我试图从B的__setstate__
还原时,它无法还原子对象,因为它还没有实例化。在
示例:
import pickle
class A:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def __eq__(self, other):
return self.x == other.x and self.y == other.y and self.z == other.z
def __getstate__(self):
return self.x, self.y, self.z
def __setstate__(self, state):
self.x, self.y, self.z = state
a = A(1, 2, 3)
a_save = pickle.dumps(a)
assert a == pickle.loads(a_save)
# WORKS FINE TO HERE
class B:
def __init__(self):
self.a = A(1, 2, 3)
self.b = 4
def __getstate__(self):
# Is this correct?
return self.a.__getstate__(), self.b
def __setstate__(self, state):
return self.a.__setstate__(), self.b
def __eq__(self, other):
return self.a == other.a and self.b == other.b
b = B()
b_save = pickle.dumps(b)
# Fails in pickle.loads HERE
assert b == pickle.loads(b_save)
这会产生:
^{pr2}$如何将a
重构为A的实例,并从保存状态还原其原始属性值?在
(请注意,这是一个玩具示例,用于演示问题。真实世界的代码要复杂得多。)
B
不应手动调用A
的__getstate__
和{B
甚至不需要知道{A
实例,就像A
没有这些方法一样:相关问题 更多 >
编程相关推荐