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

时间:2019-05-24 11:46:47

标签: python boost-python deep-copy

我有一个继承自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部分的副本?

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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