2013-02-03 2 views
2

이것은 내가 아직 작업하고있는 것은 아니다. 단지 클래스 메소드를 배우고 빨기 만하는 것이기 때문에 그냥 테스트 코드 일 뿐이다. 그러나 그러나 나는 10에 의해 그래서 내가 할 때, foo.thing(), foo는 증가 원하는 12 foo는 설정 나는 다음과 같은 코드파이썬 클래스 메쏘드가 자기를 바꾼다

class Test(int): 
    def __init__(self,arg): 
      self = arg 

    def thing(self): 
      self += 10 

가는, foo는 = 테스트 (12)가 말한다. 지금까지 foo.thing()은 12로 유지합니다. 어떻게하면이 코드를 변경할 수 있습니까?

+0

할당 '자기 = arg' 새'foo' 인스턴스에 아무것도하지 않는다 (이것은 self', 그것은'int' 서브 클래스의 인스턴스를 업데이트하지 않습니다'재 할당). 대신에'__new__' 메쏘드를 사용하십시오; '__init__'를 안전하게 제거 할 수 있습니다. –

+0

'int'는 불변이고, 마술처럼 그것을 변경 가능한 클래스로 바꿀 수는 없습니다. –

답변

4

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 += 2self = self + 2으로 해석됩니다. 다시, 당신은 self에 할당하고 그것을 새로운 값으로 대체합니다.

+0

나는 본다. 목록과 같은 것들에 대해서만 작동합니까? 그래서 그것을 수정 한 함수를 원한다면,이 함수를 이렇게 호출해야할까요? foo는 = foo.dostuff() 단지 새로운 값 –

+1

@GregHornby을 반환하는 dostuff 방법이 : 아니, 당신은 방법 안에 뭔가를 * * *이 self''의 속성 또는 메소드를 호출하기 위해 할당'dostuff을()'이 필요 on *'self'는'self' 자체에 할당하지 않습니다. –

+0

정확히 그처럼; 그러나'int' 객체에는 그런 속성이 없습니다. 나는 두렵습니다. –