Gibt es eine vernünftige Möglichkeit, einen Kopierkonstruktor in Python zu erstellen?

8

Ich habe bemerkt, dass ähnliche Fragen gestellt wurden, wenn auch nicht genau so.

Ich hätte gerne ein optionales Argument für den Konstruktor meiner Klasse, das kopiert wird, wenn es sich um eine Instanz meiner Klasse handelt. Zum Beispiel, etwas wie ( Ich weiß, dass dieser Code nicht funktioniert! ):

%Vor%

Ich weiß, dass es ein paar praktische Lösungen dafür gibt. Ich könnte jedes Attribut von self entsprechend dem Wert des entsprechenden Attributs von foo setzen, aber das wäre wirklich ärgerlich, weil meine Klasse viele, viele Attribute hat. Oder ich könnte einfach tun:

%Vor%

... Aber ich würde lieber nicht, wenn das möglich ist. Ich hoffe auch zu vermeiden, __new__ zu überschreiben.

Gibt es in Python überhaupt keinen vernünftigen Weg, einen Kopierkonstruktor zu erstellen?

    
carmenism 17.05.2012, 17:36
quelle

3 Antworten

16

Ich denke, das ist die pythischste Art, das zu tun - eine Kopierfabrik-Methode.

%Vor%

Dies ist in Python-Basistypen ziemlich häufig (zB dict.copy ). Es ist kein Kopierkonstruktor, aber ich denke nicht, dass das ein sehr pythonisches Konzept ist!

    
Nick Craig-Wood 17.05.2012, 17:52
quelle
0

Es ist möglich , indem Sie einfach alle Attribute des Quellobjekts durchlaufen, die an __init__ übergeben wurden, und dann setattr() , die Ihnen am self wichtig sind. Aber es ist nicht klar, dass dies ein guter Weg wäre, um ein Problem zu lösen. Nicht sehr Pythonic und alle.

    
the paul 17.05.2012 17:54
quelle
0

Eine gute Möglichkeit besteht darin, eine Kopie des Instanznamespace auf oberster Ebene zu erstellen.

%Vor%

Aber sei vorsichtig, wenn deine Klasse sich mit __slots__ befasst, denn in diesem Fall könnte __dict__ fehlen und du musst dich möglicherweise auf neutralere Mechanismen zum Erhalten von Attributen verlassen, wie zum Beispiel getattr()

    
thodnev 10.02.2016 06:21
quelle