因为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'>
因为int
没有__iadd__
就地添加方法,所以将您self += 2
的解释为self = self + 2
;再次,您正在分配self
并用一个新值替换它。