因爲int
是不可變的,所以不能神奇地將它變成可變類型。
你的方法是禁用的。他們在本地命名空間中更改self
,將其重新分配給其他內容。他們不再指出實例。換句話說,兩種方法都保留原始實例不變的。
你不能對int
的子類做什麼。您必須改用numeric type hooks來重新創建一個自定義類。
背景: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
並將其替換爲新的值。
賦值'self = arg'對新的'foo'實例沒有任何作用(它重新賦值'self',它不更新'int'子類實例)。改用'__new__'方法;你可以安全地忽略'__init__'。 –
'int'是不可變的,你不能神奇地把它變成一個可變類。 –