Сделать класс Python унаследованным от класса boost-python для копирования - PullRequest
7 голосов
/ 24 мая 2019

У меня есть класс, который наследуется от класса 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 относится к типу Magnet, magnet_2, но относится к типу CMagnet. Мне нужно, чтобы это было также типа Magnet. В нем отсутствуют все Magnet методы. Как получить DeepCopy для копирования (и возврата) всего объекта Magnet, а не только копии CMagnet части?

1 Ответ

3 голосов
/ 04 июня 2019

Поскольку вы не предоставили Минимальный воспроизводимый пример Я не могу быстро проверить, работает ли следующий подвох, но я думаю, что он должен.

Вы можете добавить метод __deepcopy__() в ваш класс, который делегирует работу базовому boost-python объекту, а затем фиксирует тип результата.

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

Как мне получить deepcopy для копирования (и возврата) всего объекта Magnet, а не только копии части CMagnet?

Обратите внимание, что функция generic__deepcopy__() копирует все поля входного объекта, поэтому неправильным является только тип - содержимое объекта копирования должно быть правильным.

...