2017-07-12 16 views
3

copyメソッドをクラスに実装するベストプラクティスは何ですか?ここでコピー方法を実装するためのベストプラクティス

は私のクラスの例である:

class MyClass: 
    def __init__(self, foo, bar=None): 
     self.foo = foo 
     if bar is not None: 
      self.bar = bar 
     else: 
      self.bar = {'Hello': 'Ciao'} 

私は、以下の方法を提案している5年前の記事を見つけました:

import copy 

def copy(self): 
    return MyClass(copy.copy(self.foo), copy.copy(self.bar)) 

は、それはまだそれを行うための唯一の方法ですか他の可能性はありますか?

私のオブジェクトのコピーを作成して、関数が元のオブジェクトを変更しないようにする必要があります。この関数は次のようなものです:

def translate_and_print(my_class, dict={'Hello':'Ciao'}): 
    temp = my_class # here I want to use the copy method: temp = my_class.copy() 
    temp.foo = temp.bar[temp.foo] 
    print(temp.foo) 

次のコードの出力は「チャオ」、「チャオ」であるが、私はcopy()を使用する場合は、「チャオ」、「こんにちは」

mc = MyClass('Hello') 
translate_and_print(mc) 
print(mc.foo) 

する必要がありますこの方法は、私がエラーを持っている:

AttributeError: 'MyClass' object has no attribute 'copy'

+0

、私は '' MyObjectに= MyClassの( 'foo' を)実行し、問題なく 'copy.copy(MyObjectに)を'行うことができます。エラーを再現するコードを提供できますか? –

+0

歴史上の理由から上記のコメントをそのまま残しておきます。あなたのエラーは 'my_class.copy()'を呼び出そうとしていますが、あなたは 'copy.copy(my_class)'を呼び出すべきです。 –

+0

いいえ、これは私が使用したものと同じです。 ありがとう – paolof89

答えて

1

を呼び出すことができ、私はあなたが__copy__メソッドを作成する必要がありますその代わりに、あなただけのcopyメソッドを作成しますので、それはだと思います。シャローコピーとディープコピーについて__deepcopy__ため

import copy 

class MyClass: 
    def __init__(self, name): 
     self.name = name 
    def __copy__(self): 
     return MyClass(self.name) 
    def __deepcopy__(self, memo): 
     return MyClass(copy.deepcopy(self.name, memo)) 

__copy__方法。私はあなたがポイントを持って期待し

、あなたの更新のコメントに関してはHere is the link i follow

5

あなたは__copy__メソッドを実装し、そしておそらくも__deepcopy__必要があります。ドキュメントの状態:あなたは、いくつかの魔法(例えばCの割り当て、またはCライブラリをステートフル呼び出し)を行う場合を除き言ったことで

In order for a class to define its own copy implementation, it can define special methods __copy__() and __deepcopy__() . The former is called to implement the shallow copy operation; no additional arguments are passed. The latter is called to implement the deep copy operation; it is passed one argument, the memo dictionary. If the __deepcopy__() implementation needs to make a deep copy of a component, it should call the deepcopy() function with the component as first argument and the memo dictionary as second argument.

は、あなたが__copy__を自分で実装する必要はありませんが、Pythonは自由のためのあなたのためにこれを提供します、あなたは単にあなたがAttributeErrorを得たcopy.copy(myobject)

+0

提案をいただきありがとうございますが、これはメソッドの実装方法については説明していません。 – paolof89

+0

あなたの例では、 '__copy__'を実装する理由はありません。実際に実装する必要のある低レベルのリソースを実際に使用するユースケースがある場合は、サンプルを更新できますか?それを支援できますか?あなたの例では、Pythonはデフォルトでそれを行うので、あなたが提案する実装​​は何も追加しません。 –

+0

私は質問を編集しました。 copy()メソッドが自分のクラスに実装されていません。 – paolof89

関連する問題