在序列化之前修改对象

时间:2018-04-15 16:49:33

标签: python python-3.x

我有一个类C,它必须在父进程上使用GPU,但只能在子进程上使用CPU。

由于C通过序列化发送到子进程,为了更安全,我决定将__reduce__添加到C,以便我可以在序列化之前修改一个标志:< / p>

def __reduce__(self):
    """
    This is just to avoid that we use the gpu on subprocesses.
    """
    p = self.copy(shallow=True)
    p._cpu_only = True

    return _dummy_rebuild, (p,)

由于无限递归,这不起作用。我看到两个解决方案:

  1. __reduce__
  2. 中移除p
  3. 返回p的属性并从中重建
  4. 我认为选项1更可取,因为它并不依赖于类的内部。

    唯一的问题是我无法移除__reduce__。有办法吗?

1 个答案:

答案 0 :(得分:2)

* 无法从__reduce__删除p,因为仅__reduce__方法存在于您的班级而不是每个单独的实例。您可以通过从类中删除它来从所有实例中删除它,但是您不能仅从选择的实例中删除它。

(*从技术上讲,它取决于序列化程序。根据序列化程序如何检查是否存在__reduce__方法,它可能会也可能不会被欺骗认为p没有。但这绝对不是一个好主意。)

因此,您唯一/最佳选择是重写__reduce__方法,以便它不会返回您班级的实例。