2010-01-28 2 views
26

오브젝트 kclass A 인 것으로 가정하십시오. 우리는 두 번째로 class B(A)을 정의했습니다. 개체 kclass B으로 "변환"하고 모든 데이터를 k에 보존하는 가장 좋은 방법은 무엇입니까?파이썬 오브젝트 변환

+2

어떤 방식으로 변환 하시겠습니까? 클래스 B 객체의 모든 멤버 변수를 유지하고 싶지만 부모 클래스 A의 메소드 세트를 사용 하시겠습니까? – BrainCore

+3

이것은 매우 불쌍한 다형성입니까? 공통 수퍼 클래스의 A 및 B 서브 클래스입니까? 그렇다면 이것은 잘못된 행동입니다. A가 B와 같은 방법을 원했습니까? 이는 다중 상속을 통해 수행됩니다. 파이썬에서 캐스팅이나 타입 변환이 필요하다고 생각한다면 틀린 생각을하기 때문에 이것을 왜 필요하다고 생각하는지 설명해주십시오. –

+0

유스 케이스에 대해서도 궁금합니다. 고전적인 다형성 (polymorphism)의 도움을받는 것 외에 다른 문제를 해결하는 더 좋은 방법이라고 생각하십니까? –

답변

17

이것은 "클래스 변환"을 수행하지만 담보의 충격에 의해 손상 될 수 있습니다. 다른 객체를 만들고 BrainCore가 게시 된대로 __dict__을 게시하면 더 안전합니다.하지만이 코드는 새 객체를 만들지 않고 요청한대로 수행합니다.

class A(object): 
    pass 

class B(A): 
    def __add__(self, other): 
     return self.value + other 


a = A() 
a.value = 5 

a.__class__ = B 

print a + 10 
7
a = A() # parent class 
b = B() # subclass 
b.value = 3 # random setting of values 

a.__dict__ = b.__dict__ # give object a b's values 

# now proceed to use object a 

사용 사례를 충족합니까? 참고 : b의 인스턴스 변수 만 클래스 A의 클래스 변수가 아니라 객체 a에서 액세스 할 수 있습니다. 당신이 deepcopy을하지 않는 한 또한,에서 수정 변수, B의 변수를 수정합니다 :

import copy 
a.__dict__ = copy.deepcopy(b.__dict__) 
+1

실제로 변수는 복사되지 않습니다. 'a'와'b'는 이제 모두'__dict__'를 공유하기 때문에'a.value'를 설정하면'b.value'도 변경됩니다. –

+0

당신이 맞습니다, 고마워요, 고마워요. – BrainCore

+0

실제로이 작업을 수행하면 "a"개체가 즉시 삭제되어야합니다. 다른 하나는 서로 다른 클래스에서 동일한 속성을 공유하는 두 개의 다른 객체로 끝납니다. 이보다 더 나쁜 시나리오는 거의 없습니다. (대화 형 프롬프트에서조차도 놀아서는 안됩니다) – jsbueno

관련 문제