、__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つの方法の間にこのような依存関係はありませんでした。
これはどのような意味で危険な行為ですか?