pickle:如何对包含的obj调用设置状态

2024-10-02 00:39:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有类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的实例,并从保存状态还原其原始属性值?在

(请注意,这是一个玩具示例,用于演示问题。真实世界的代码要复杂得多。)


Tags: and实例self示例return属性savedef
1条回答
网友
1楼 · 发布于 2024-10-02 00:39:45

B不应手动调用A__getstate__和{}。B甚至不需要知道{}有那些方法。它应该处理嵌套的A实例,就像A没有这些方法一样:

def __getstate__(self):
    return (self.a, self.b)
def __setstate__(self, state):
    self.a, self.b = state

相关问题 更多 >

    热门问题