首页 > 解决方案 > 使从 boost-python 类继承的 Python 类可复制

问题描述

我有一个继承自 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)

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

标签: pythonboost-pythondeep-copy

解决方案


由于您没有提供最小的、可重现的示例,我无法快速检查以下肮脏的技巧是否有效,但我认为它应该有效。

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

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

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

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


推荐阅读