使从boost-python类继承的Python类具有可复制性

zeu*_*300 7 python deep-copy boost-python

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

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

    def python_method(self):
        ...
Run Code Online (Sandbox Code Playgroud)

在CMagnet的C ++实现中,我使用了1中的代码,如2中所示

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

magnet = Magnet()
magnet_2 = copy.deepcopy(magnet)
Run Code Online (Sandbox Code Playgroud)

然后magnet是类型Magnetmagnet_2但是是类型CMagnet。我需要它也要类型Magnet。它缺少所有Magnet方法。如何获得Deepcopy来复制(并返回)整个Magnet对象,而不仅仅是CMagnet零件的副本?

Leo*_*eon 4

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

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

def __deepcopy__(self, memo):
    result = super().__deepcopy__(memo)
    result.__class__ = self.__class__
    return result
Run Code Online (Sandbox Code Playgroud)

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

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