2016-08-29 3 views
1

У меня есть 2 класса, назовем их Class1 и Class2 (Class1), а Class2 - из класса 1.Как вызвать deepcopy с супер в python?

В Class1, copy.deepcopy работает очень хорошо, и я не хотите реализовать метод DeepCopy на Class1.

Теперь у меня есть экземпляр i2 = Class2 (someParameters). Я хочу сделать глубокую копию i2, как, например, в Class1.

Я не могу вызвать copy.deepcopy (i2), потому что это будет deepcopy i2, как в случае класса2 (с проблемами подписи в моем случае).

Я не могу назвать super(). deepcopy (i2) потому что deepcopy не найден в классе1, и один возвращается к вычислению copy.deepcopy (i2) как экземпляр класса2, и мы переходим к бесконечному циклу.

Как продолжить, чтобы вызвать встроенную копию.deepcopy (i2), касающуюся i2 в качестве экземпляра Class1?

Благодарим вас за идеи, Лоран.

EDIT: Как спросил в комментариях, пример кода, чтобы показать проблему подписи, если я просто называю copy.deepcopy

import copy 
from copy import deepcopy 


class Class1(object): 
    pass 

class Class2(Class1): 
    def __new__(cls,start): 
     eClass1=Class1.__new__(cls) 
     Class1.__init__(eClass1) 
     eClass1.start=start 
     return eClass1 

instanceClass2=Class2(1) 
copy.deepcopy(instanceClass2) 

Ответ от переводчика:

Traceback (most recent call last): 
    File "essaiDebug7.py", line 18, in <module> 
    copy.deepcopy(instanceClass2) 
    File "/usr/lib/python2.7/copy.py", line 190, in deepcopy 
    y = _reconstruct(x, rv, 1, memo) 
    File "/usr/lib/python2.7/copy.py", line 329, in _reconstruct 
    y = callable(*args) 
    File "/usr/lib/python2.7/copy_reg.py", line 93, in __newobj__ 
    return cls.__new__(cls, *args) 
TypeError: __new__() takes exactly 2 arguments (1 given) 

ответ

0

Как насчет вместо наследования Class1, создать объект Class2 in Class1? Как:

class Class2(object): 
    def __init__(self): 
     self.class_1 = Class1() 

# Then deepcopy 
copy.deepcopy(class_2.class_1) 

Примечание: Было бы замечательно, если вы можете поделиться реальный сценарий. Потому что, основываясь на проблеме, о которой вы говорили, я не думаю, что ваши классы наследуются. Если они есть, Я не понимаю, почему вы просто хотите скопировать родительский класс?

+0

Родительский класс и дочерний класс не имеют одинаковой сигнатуры, в дочернем классе имеется больше параметров. Таким образом, если я пытаюсь выполнить глубокую копию родительского класса с помощью copy.deepcopy, начинается рекурсивная процедура. Когда эта рекурсия находится на уровне родителя, интерпретатор Python жалуется, как: TypeError: __new __() принимает ровно 1 аргумент (2 задано) –

+0

Moinuddin, вы правы, это более понятно с примера. Просто добавил. –