int
이 변경 불가능하기 때문에 마술처럼 변경할 수있는 유형으로 변경할 수 없습니다.
귀하의 방법은 no-ops입니다. 그들은 로컬 네임 스페이스에서 self
을 다른 것으로 재 할당하여 변경합니다. 그들은 더 이상 인스턴스를 가리 키지 않습니다. 즉, 두 가지 방법 모두 원본 인스턴스 인 을 그대로 유지합니다..
서브 클래스가 int
인 경우 수행하려는 작업을 수행 할 수 없습니다. 대신 numeric type hooks을 사용하여 처음부터 맞춤 클래스를 만들어야합니다.
배경 : int
에는 실제 값을 self
에 할당하는 방법이 있으며 인플레 이스 (in-place) 추가를 지원하는 방법이 없습니다. __init__
메소드는 무시되지 않지만 이미 __new__
이 작업을 완료 했으므로 완전히 생략 할 수 있습니다.
>>> 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
에 할당
당신은 그냥 당신이 self
에 대한 아무것도 변경하지 않은 다른 뭔가 인스턴스에 대한 참조를 교체 의미 대신 self += 2
은 self = self + 2
으로 해석됩니다. 다시, 당신은 self
에 할당하고 그것을 새로운 값으로 대체합니다.
할당 '자기 = arg' 새'foo' 인스턴스에 아무것도하지 않는다 (이것은 self', 그것은'int' 서브 클래스의 인스턴스를 업데이트하지 않습니다'재 할당). 대신에'__new__' 메쏘드를 사용하십시오; '__init__'를 안전하게 제거 할 수 있습니다. –
'int'는 불변이고, 마술처럼 그것을 변경 가능한 클래스로 바꿀 수는 없습니다. –