[解決済み] Pythonオブジェクトのコピー/ディープコピー操作をオーバーライドするには?
質問
の違いについて理解しています。
copy
vs.
deepcopy
をコピーモジュールで使用します。私はこれまで
copy.copy
と
copy.deepcopy
をオーバーロードするのは初めてです。
__copy__
と
__deepcopy__
というメソッドがあります。 私はすでにググって、組み込みのPythonモジュールに目を通した上で
__copy__
と
__deepcopy__
関数(例えば
sets.py
,
decimal.py
そして
fractions.py
) を使っていますが、まだ100%正しいとは言えません。
これが私のシナリオです。
設定オブジェクトがあります。 最初は、デフォルトの値のセットを持つ1つの設定オブジェクトをインスタンス化するつもりです。 この構成は、他の複数のオブジェクトに渡されます (すべてのオブジェクトが同じ構成で開始されるようにするため)。 しかし、ユーザーとの対話が始まると、各オブジェクトは互いの構成に影響を与えることなく、独立して構成を調整する必要があります(つまり、私の初期構成のディープコピーを作成して渡す必要がある、ということです)。
ここにサンプルオブジェクトがあります。
class ChartConfig(object):
def __init__(self):
#Drawing properties (Booleans/strings)
self.antialiased = None
self.plot_style = None
self.plot_title = None
self.autoscale = None
#X axis properties (strings/ints)
self.xaxis_title = None
self.xaxis_tick_rotation = None
self.xaxis_tick_align = None
#Y axis properties (strings/ints)
self.yaxis_title = None
self.yaxis_tick_rotation = None
self.yaxis_tick_align = None
#A list of non-primitive objects
self.trace_configs = []
def __copy__(self):
pass
def __deepcopy__(self, memo):
pass
を実装する正しい方法は何でしょうか?
copy
と
deepcopy
メソッドを使用して、このオブジェクトの
copy.copy
と
copy.deepcopy
は、私に適切な動作を与えますか?
どのように解決するのですか?
カスタマイズのための推奨事項は、一番最後にある ドキュメント・ページ :
クラスは、コピー制御のために使用するのと同じインターフェイスを コピーを制御するために使用されるのと同じ ピックリングを制御するのと同じインターフェイスを使うことができます。pickleモジュールの説明を見てください。 モジュール pickle の説明を参照してください。 を参照してください。コピーモジュールは 登録モジュール copy_reg を使用しません。 モジュールを使用します。
クラスが独自の コピーの実装を定義するために、そのクラスは 特別なメソッド
__copy__()
と__deepcopy__()
. 前者は浅いコピー操作を実装するために呼ばれます。 操作を実装するために呼び出されます。 は渡されません。後者は,ディープコピー操作を実装するために呼び出されます。 ディープコピー操作を実装するために呼び出される。 は1つの引数、メモ 辞書が渡される。もし__deepcopy__()
実装がコンポーネントの深いコピーを作成する必要がある場合 コンポーネントのディープコピーを作成する必要がある場合、それは を呼び出します。deepcopy()
関数を呼び出します。 コンポーネントを第一引数として メモ辞書を第2引数にとります。
カスタマイズのピックリングには関心がないようなので、以下のように定義します。
__copy__
と
__deepcopy__
が間違いなくあなたに合った方法だと思われます。
具体的には
__copy__
(浅いコピー)は、あなたの場合、かなり簡単だと思いますが...。
def __copy__(self):
newone = type(self)()
newone.__dict__.update(self.__dict__)
return newone
__deepcopy__
も同様です。
memo
の引数も受け取る) が、リターンの前に
self.foo = deepcopy(self.foo, memo)
を呼び出さなければなりません。
self.foo
を通して他のものを保持するリスト、ディクショ ン、非プリミティブオブジェクトなどのコンテナである属性は、深いコピー が必要です。
__dict__
s).
関連
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] Pythonでオブジェクトが属性を持つかどうかを知る方法
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】リストをディープコピーする方法?
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] ファブリック経由でデプロイユーザとしてvirtualenvを有効化する
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] 古いバージョンのPythonにおける辞書のキーの並び順
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] Python Empty Generator 関数
-
[解決済み] Pythonでファイルの読み込みと上書きをする
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法