2017-12-20 17 views
3

2 개의 클래스 A 및 B가있는 경우 클래스 A의 인스턴스를 클래스 B에 "점프"할 수있는 방법이 있습니까?객체 클래스 및 관련 함수를 변경하는 방법

클래스 A의 인스턴스를 호출 할 때 본질적으로 클래스 A의 인스턴스를 클래스 B 객체로 다시 초기화하고 클래스 B의 정상적인 인스턴스로 실행을 계속하는 클래스 A에 대한 함수를 작성하고자합니다. B 클래스와 비슷한 기능을 만들고 싶습니다. 가능합니까?

+0

코드 냄새처럼 보입니다. 수업을 게시하고 달성하고자하는 것을 설명 할 수 있습니까? –

+0

나는 그것을 좋아하지 않지만 다른 생각을 할 수는 없다. 아직 파일을 만들지는 않았지만 플래그 게임을 자율적으로 제작하고 있습니다. 각 팀에는 방어적이고 공격적인 두 명의 에이전트가 있으며, 하나가 죽으면 역할을 바꾸기를 원합니다. 이것은 해결책 같았습니다 –

+0

그것은 냄새입니다. 역할은 객체의 _property_이며 런타임에 할당되어야합니다. 서로 다른 역할에 대해 허용되는 동작은 객체 구성 또는 자체 롤 (roll-your-own) 기능 테이블을 사용하여 관리 할 수 ​​있습니다. 이건 정말'class' IMHO에는 좋지 않습니다. 그러나 다른 사람들은 동의하지 않을 수 있습니다. –

답변

2

놀랍게도 예.

>>> class C: pass 
... 
>>> c = C() 
>>> type(c) 
<class '__main__.C'> 
>>> c.__class__ 
<class '__main__.C'> 
>>> 
>>> 
>>> class D: pass 
... 
>>> c.__class__ = D 
>>> c.__class__ 
<class '__main__.D'> 
>>> type(c) 
<class '__main__.D'> 

필자는이를 위해 Python 3.6.3을 사용했습니다.

행동 중 점프하고 싶습니까? 이것을 확인해보십시오 :

>>> class C: 
... def speak(self): 
...  return "I'm a C" 
... 
>>> class D: 
... def shout(self): 
...  return "I'M A D" 
... 
>>> c = C() 
>>> c.speak() 
"I'm a C" 
>>> c.__class__ = D 
>>> c.shout() 
"I'M A D" 

우리는 당신을 사랑합니다, 어쩌면 ... 나는 이상합니다. 하지만 근사 하네, 응?

원래 클래스의 속성을 유지하는 방법을 직접 확인해 보는 것은 어떻습니까! 그것은 청초하다.