2012-10-10 3 views
2

는 말 :의 인스턴스 방법으로 인스턴스 자체를 조작과 유사한 내용이 궁금

>>> class A(object): 
...  def swap(self): 
...   self = 'I am swapped' 
... 
>>> abc=A() 
>>> abc 
<__main__.A object at 0x028B6130> 
>>> abc.swap 
<bound method A.swap of <__main__.A object at 0x028B6130>> 
>>> abc.swap() 
>>> abc 
<__main__.A object at 0x028B6130> 
>>> type(abc) 
<class '__main__.A'> 

보고, 당신이 혼란

+0

저는 거의 모든 프로그래밍 언어로이 작업을 수행 할 수 없다고 확신합니다. 비록 _why_에 확실하지 않습니다. –

+0

이것은 꽤 나쁜 디자인 패턴입니다 ... 그 중 하나는 당신이 할 수 없다는 것을 의미합니다 ... 더 좋은 옵션은 공장 디자인 패턴을 찾을 것입니다 –

+0

@macek 실제로 가능합니다 ... –

답변

0

이 나는 ​​대신 공장 디자인 패턴을 사용하여 볼 ... 지금이 ... 사실 당신이 어떤 희생을 치르더라도 피해야하고 옹호하지 않습니다 ... 끔찍한 생각입니다 ...

>>> class A: 
... def swap(self): 
...  self.__class__ = B 
... 
>>> class B: 
... pass 
... 
>>> a = A() 
>>> a.swap() 
>>> a 
<__main__.B instance at 0x02C43E18> 
>>> 
+2

yuck! 남자를 쏴 죽였어. 남자에게 자신을 쏘라고 가르치십시오, 그리고 감옥에 갈 필요조차 없습니다! – wim

+0

나는 동의한다. 그러나 그것은 질문에 답한다. .. 그리고 나는 처음에 꽤 좋은 부인을 뒀다. .. –

3

str에되지 않는 유형,하지만 클래스 A.이다 -가 여기에 self = 'I am swapped'을 사용하여 이름을 다시 바인딩하는 데 특별한 것은 없습니다. self을 문자열 개체에 할당하면 여기에 로컬 변수로 사용됩니다. 부모 개체를 전혀 변형시키지 않았습니다. 여기

는 증거입니다 :

>>> class A(object): 
... def swap(self): 
...  print id(self) 
...  self = 'I am a different object now' 
...  print id(self) 
... 
>>> abc = A() 
>>> id(abc) 
139677585341456 
>>> abc.swap() 
139677585341456 
139677585341296 
>>> id(abc) 
139677585341456 

그런데, 당신도 멤버 함수의 첫 번째 인수에 대해 말씀 self을 사용할 필요가 없습니다. 이것은 파이썬 사용자가 사용하는 명명 규칙이지만 다른 변수 이름에도 사용할 수 있습니다.

0

self은 규칙입니다. 클래스의 인스턴스는 첫 번째 인수에서 해당 함수에 전달되는 것이므로 원하는대로 호출 할 수 있으며 특정 함수의 로컬 네임 스페이스에 원하는대로 할 수 있습니다. 참조 :

>>> class A: 
...  def f(hats): 
...   print hats 
... 
>>> a = A() 
>>> a.f() 
<__main__.A instance at 0x100466908> 

그래서 그래, 당신은 클래스 메소드에 self을 조작 할 수 있지만, self 이후 자체가 실제로 아무것도 의미하지 않는다, 진짜 포인트가 없습니다. 조란이 제안한 바를 (하지 마)해야한다.