は不変であるためint、魔法のように可変タイプに変換することはできません。
あなたの方法はノーオペレーションです。ローカル名前空間では、別の名前空間に再割り当てすることで変更selfされます。それらはもはやインスタンスを指していません。つまり、どちらのメソッドも元のインスタンスを変更せずに残します。
のサブクラスでやりたいことをすることはできませんint。代わりに数値型フックを使用して、カスタムクラスを最初から作成する必要があります。
背景:実際の値をに割り当てるメソッドがintあり、インプレース追加をサポートするメソッドはありません。この方法は無視されませんが、すでに作業を行っているため、完全に除外することができます。__new__self__iadd____init____new__
に割り当てるとは、インスタンスへの参照を別のものに置き換えただけで、次については何も変更selfしなかったことを意味します。self
>>> class Foo(int):
... def __init__(self, value=0):
... print self, type(self)
... self = 'foobar'
... print type(self)
...
>>> foo = Foo(10)
10 <class '__main__.Foo'>
<type 'str'>
>>> print foo, type(foo)
10 <class '__main__.Foo'>
インプレースのaddメソッドintがないため、は代わりにとして解釈されます。繰り返しになりますが、これを新しい値に割り当てて、完全に新しい値に置き換えます。__iadd__self += 2self = self + 2self