は不変であるため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 += 2
self = self + 2
self