【问题标题】:Make Python class inherited from boost-python class copyable使从 boost-python 类继承的 Python 类可复制
【发布时间】:2019-05-24 11:46:47
【问题描述】:

我有一个继承自 boost-python 类的类:

class Magnet(CMagnet):   # CMagnet is a C++ based boost-python class
    def __init__(self):
        CMagnet.__init__(self)

    def python_method(self):
        ...

在 CMagnet 的 C++ 实现中,我使用了来自 1 的代码,发布在 2 中。

我现在遇到以下问题:当我执行以下操作时:

magnet = Magnet()
magnet_2 = copy.deepcopy(magnet)

那么magnet 的类型为Magnetmagnet_2,然而,类型为CMagnet。我需要它也是Magnet 类型。它缺少所有Magnet 方法。如何让 deepcopy 复制(并返回)整个 Magnet 对象,而不仅仅是 CMagnet 部分的副本?

【问题讨论】:

  • 有一个related question表示你应该自己实现__deepcopy__,但我不知道你是否已经在这样做,或者你的实现是否有任何错误;就像@Leon 所说,最好提供一个可重现的示例。

标签: python boost-python deep-copy


【解决方案1】:

由于您没有提供Minimal, Reproducible Example,因此我无法快速检查以下肮脏技巧是否有效,但我认为应该可以。

您可以将__deepcopy__() 方法添加到您的类,该方法将工作委托给底层boost-python 对象,然后修复结果的类型。

def __deepcopy__(self, memo):
    result = super().__deepcopy__(memo)
    result.__class__ = self.__class__
    return result

如何让 deepcopy 复制(并返回)整个 Magnet 对象,而不仅仅是 CMagnet 部分的副本?

注意generic__deepcopy__()函数复制了输入对象的所有字段,因此只有类型错误——复制对象的内容应该是正确的。

【讨论】:

  • 完美,有效。你是对的,只是类型错了,方法一直都在那里。您提供的示例中的第二行应为 result = super().__deepcopy__(memo) 提供所有材料以重新创建问题,即使是最小的集合,对于 boost python 来说也不容易,因为它需要相当多的基础设施来设置整件事了。但幸运的是,提供的信息毕竟足够了。
  • @zeus300 修复了第二行。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2020-04-28
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多