2016-08-29 2 views
1

J'ai 2 classes, appelons-les Class1 et Class2 (Class1), et Class2 dérive de Class1.Comment appeler deepcopy avec super en python?

Dans Class1, copy.deepcopy fonctionne très bien et je ne le font pas veulent mettre en œuvre une méthode deepcopy sur Class1.

Maintenant, j'ai une instance i2 = Class2 (someParameters). Je veux faire une copie en profondeur de i2 comme dans l'exemple de Class1.

Je ne peux pas appeler copy.deepcopy (i2) parce que ce serait deepcopy i2 comme dans l'exemple de class2 (avec des problèmes de signature dans mon cas).

Je ne peux pas appeler super(). deepcopy (i2) parce que deepcopy ne se trouve pas dans class1, et on retombe dans le calcul de copy.deepcopy (i2) comme une instance de class2, et on passe à une boucle infinie. Comment procéder ensuite pour appeler le copy.deepcopy (i2), en considérant i2 comme une instance de Class1?

Merci pour vos idées, Laurent.

EDIT: Comme demandé dans les commentaires, un exemple de code pour montrer le problème de la signature si je l'appelle simplement 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) 

La réponse de l'interprète:

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) 

Répondre

0

Que diriez-vous au lieu d'hériter Class1, créez un objet de Class2 in Class1? Comme:

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

# Then deepcopy 
copy.deepcopy(class_2.class_1) 

Remarque: Ce serait génial si vous pouvez le scénario réel. Parce que, selon le problème que vous avez mentionné, je ne pense pas que vos classes sont héréditaires. Si c'est le cas, je ne comprends pas pourquoi vous voulez juste copier la classe parent?

+0

La classe parente et la classe enfant n'ont pas la même signature, il y a plus de paramètres dans la classe enfant. Ainsi, si j'essaie de copier en profondeur la classe parent en utilisant copy.deepcopy, une procédure récursive est démarrée. Lorsque cette récursion est au niveau du parent, l'interpréteur Python se plaint comme suit: TypeError: __new __() prend exactement 1 arguments (2 donnés) –

+0

Moinuddin, tu as raison, c'est plus clair avec un exemple. Je viens de l'ajouter. –