6 Stimmen

Kopie vs. Deepcopy: Semantik

Meine Klasse stellt Zustände verschiedener Systeme dar. Jede Instanz hat zwei Attribute: Das eine ist ein Container, der von allen Zuständen desselben Systems gemeinsam genutzt wird, und das andere ist ein Container, der für jede Instanz einzigartig ist.

Eine Kopie eines Zustands sollte das Attribut "shared" wiederverwenden, aber eine Deep Copy des Attributs "unique" erstellen. Dies ist wirklich die einzige Kopiersemantik, die Sinn macht (es ist natürlich, dass die Kopie eines Zustands ein Zustand desselben Systems ist).

Ich möchte, dass die Leute, die meinen Code lesen und pflegen, möglichst wenig überrascht werden. Sollte ich überschreiben __deepcopy__ o __copy__ für meine Zwecke?

4voto

Andrew Clark Punkte 193562

Ist es wirklich notwendig, das Kopiermodul für das Kopieren von Instanzen dieser Klasse zu verwenden? Ich würde argumentieren, dass anstelle des Überschreibens von __copy__ o __deepcopy__ sollten Sie eine copy Methode für Ihre Klasse, die ein neues Objekt mit der von Ihnen definierten Kopiersemantik zurückgibt.

Wenn Sie aus irgendeinem Grund der Konsistenz das Kopiermodul verwenden müssen, dann sollten Sie meiner Meinung nach __deepcopy__ angemessener ist. Wenn es ein definiertes Verhalten der Klasse ist, dass alle Instanzen einen der Container teilen, dann ist es vernünftig anzunehmen, dass eine Implementierung von __deepcopy__ würde das respektieren.

0voto

unutbu Punkte 769083

Ist dies mit Ihrer Situation vergleichbar?

import copy

class Foo(object):
    shared = [[]]
    def __init__(self):
        self.perinstance = [[]]

Wenn dies der Fall ist, brauchen Sie nicht zu definieren __copy__ o __deepcopy__ , da das Standardverhalten von copy.deepcopy teilt Klassenattribute und kopiert Instanzattribute tief:

x = Foo()
z = copy.deepcopy(x)
assert id(z.shared) == id(x.shared)
assert id(z.shared[0]) == id(x.shared[0])
assert id(z.perinstance) != id(x.perinstance)
assert id(z.perinstance[0]) != id(x.perinstance[0])

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X