Python copy
moduleは、クラスがコピー動作をカスタマイズできるように、pickle
moduleインターフェイスを再利用できます。
カスタムクラスのインスタンスの既定値は、新しい空のクラスを作成し、__class__
属性をスワップし、次に浅いコピーの場合はコピーの__dict__
を元の値で更新するだけです。ディープコピーは、代わりに__dict__
を再帰します。
それ以外の場合は、__getstate__()
メソッドを指定して内部状態を返します。これはあなたのクラス__setstate__()
が再び受け入れることができる任意の構造にすることができます。
まただけコピー動作を制御するために__copy__()
および/または__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
は、あまりにもコピーされるのを防ぐために、カスタムコピーフックを定義します。
自分でデザインしたクラスでライブラリが動作しないとはどういう意味ですか? 'copy.copy'と' copy.deepcopy'で何が問題になっていますか? –