2017-10-03 17 views
0

__iadd__ように__add__方法を委任しない任意の理由がある:私はcopy.deepcopyがために問題になるかもしれないという事実以外に何を考え出すことはできませんカスタムクラスのインプレース追加に追加を委任することをお勧めしますか?追加をサポートする必要があるカスタムクラスを考えると

def __add__(self, other): 
    if not self.comparable(other): 
     raise ValueError("Objects cannot be added!") 

    temp = copy.deepcopy(self) 
    temp += other 
    return temp 

def __iadd__(self, other): 
    if not self.comparable(other): 
     raise ValueError("Objects cannot be added!") 

    self.x += other.x 
    self.y += other.y 
    # ... whatever else addition voodoo 

は、メモリが追加されているのでとなり、新しいオブジェクトが返され、selfは変更されません。これは避けることができません。代わりに、新しいオブジェクトをコンストラクタでインスタンス化する方法もあります。クラスには多数の可変変数がある場合、それは実際にはうってつけの選択肢ではありません。私の場合、ここではトレーニングデータ全体から生成される確率論的モデルなので、コピーを取得する方が簡単でした。

上記の定義はすべて要件を満たしていますが、チュートリアルの2つの方法の間にこのような依存関係はありませんでした。

これはどのような意味で危険な行為ですか?

答えて

1

C++でやっていることは自然で推奨される方法です。

一方、(基本整数型や文字列型のような)変更不能なオブジェクトがある場合、__iadd__はなく、__add__を直接実装する必要があります。

the docsから、あなたは__iadd__を持っていない場合は、x += yx.__add__(y)またはy.__radd__(x)のいずれかを起動して、Xに結果を代入します。

関連する問題