2016-08-29 3 views
1

Ich habe 2 Klassen, nennen wir sie Class1 und Class2 (Class1) und Class2 von Class1.Wie Deepcopy mit Super in Python aufrufen?

In Class1 arbeitet copy.deepcopy sehr gut und ich nicht wollen, ein Verfahren implementieren auf Class1 deep.

Jetzt habe ich eine Instanz i2 = Class2 (someParameters). Ich möchte eine Tiefenkopie von i2 wie in Instanz von Class1 machen.

Ich kann copy.deepcopy (i2) nicht aufrufen, weil dies i2 wie in Instanz von class2 (mit Signaturproblemen in meinem Fall) deepcopy würde.

Ich kann nicht super() aufrufen. decopy (i2), weil decopy nicht in Klasse1 gefunden wird, und man greift zurück auf die Berechnung von copy.deepcopy (i2) als eine Instanz von Klasse2, und wir gehen zu einer Endlosschleife.

Wie gehe ich dann vor, um die eingebaute copy.deepcopy (i2) aufzurufen, was i2 als Instanz von Class1 betrifft?

Vielen Dank für Ihre Ideen, Laurent.

EDIT: Wie in den Kommentaren, die ein Beispiel für Code aufgefordert, die Signatur Problem zu zeigen, wenn ich einfach copy.deepcopy vom Dolmetscher

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) 

Die Antwort

nennen:

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) 

Antwort

0

Wie wäre es Anstatt Class1 zu erben, erstellen Sie ein Objekt Class2 in Class1? Wie:

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

# Then deepcopy 
copy.deepcopy(class_2.class_1) 

Hinweis: Es wäre schön, wenn Sie das reale Szenario teilen können. Weil ich, basierend auf dem von Ihnen erwähnten Problem, nicht glaube, dass Ihre Klassen vererbbar sind. Wenn sie sind, Ich verstehe nicht, warum Sie nur Elternklasse kopieren möchten?

+0

Die Elternklasse und die Kindklasse haben nicht die gleiche Signatur, es gibt mehr Parameter in der Kindklasse. Wenn ich also versuche, die Elternklasse mit copy.deepcopy zu deceptieren, wird eine rekursive Prozedur gestartet. Wenn diese Rekursion auf der Ebene des Elternteils ist, beschwert sich der Python-Interpreter wie folgt: TypeError: __new __() benötigt genau 1 Argumente (2 gegeben) –

+0

Moinuddin, du hast Recht, es ist klarer mit einem Beispiel. Habe es einfach hinzugefügt. –

Verwandte Themen