pythoncopy
モジュールは、クラスがコピー動作をカスタマイズできるようにするために、pickle
モジュールインターフェイスを再利用できます。
カスタム クラスのインスタンスのデフォルトでは、新しい空のクラスを作成し、属性を交換します。その後、浅いコピーの場合は、コピーの を元の値で__class__
更新するだけです。__dict__
ディープ コピーは__dict__
代わりに再帰します。
__getstate__()
それ以外の場合は、内部状態を返すメソッドを指定します。__setstate__()
これは、クラスが再度受け入れることができる任意の構造にすることができます。
__copy__()
and/or__deepcopy__()
メソッドを指定して、コピー動作のみを制御することもできます。これらのメソッドは、自分自身ですべてのコピーを行うことが期待されており、メソッドには再帰呼び出し__deepcopy__()
に渡すためのメモ マッピングが渡されます。deepcopy()
例は次のとおりです。
from copy import deepcopy
class Foo(object):
def __init__(self, bar):
self.bar = bar
self.spam = expression + that * generates - ham # calculated
def __copy__(self):
# self.spam is to be ignored, it is calculated anew for the copy
# create a new copy of ourselves *reusing* self.bar
return type(self)(self.bar)
def __deepcopy__(self, memo):
# self.spam is to be ignored, it is calculated anew for the copy
# create a new copy of ourselves with a deep copy of self.bar
# pass on the memo mapping to recursive calls to copy.deepcopy
return type(self)(deepcopy(self.bar, memo))
この例では、カスタム コピー フックを定義しself.spam
て、新しいインスタンスが新たに計算するため、コピーも防止します。