6

私のクラスは、さまざまなシステムの状態を表します。各インスタンスには 2 つの属性があります。1 つは同じシステムのすべての状態間で共有されるコンテナーであり、もう 1 つは各インスタンスに固有のコンテナーです。

状態のコピーは「共有」属性を再利用する必要がありますが、「一意」属性のディープ コピーを作成します。これは実際に意味のある唯一のコピー セマンティクスです (状態のコピーが同じシステムの状態であることは当然です)。

私のコードを読んで維持する人々に、できるだけ驚きを与えないようにしたいのです。オーバーライドする必要がありますか、__deepcopy__それとも__copy__私の目的ですか?

4

2 に答える 2

4

このクラスのインスタンスをコピーするために copy モジュールを使用する必要は本当にありますか? オーバーライドする代わりに、定義したコピー セマンティクスを使用して新しいオブジェクトを返すクラスのメソッドを作成する必要があると主張__copy__します__deepcopy__copy

何らかの一貫性のある理由で copy モジュールを使用する必要がある場合は、私の意見__deepcopy__ではより適切です。__deepcopy__すべてのインスタンスがコンテナーの 1 つを共有することがクラスの定義済みの動作である場合、 の実装がそれを尊重すると仮定するのが合理的です。

于 2012-04-20T22:04:52.577 に答える
0

これはあなたの状況に似ていますか?

import copy

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

その場合、共有クラス属性とディープコピーインスタンス属性のデフォルトの動作のため、__copy__またはを定義する必要はないようです。__deepcopy__copy.deepcopy

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])
于 2012-04-20T22:08:36.453 に答える