2012-04-05 1 views
4

일부 함수에서 반환 된 부모 개체를 자식 클래스로 변환하는 방법을 알고 싶습니다.부모를 자식 클래스로 변환 (상속)하는 방법은 무엇입니까?

class A(object): 
    def __init__(): 
     pass 

class B(A): 
    def functionIneed(): 
     pass 

i = module.getObject()# i will get object that is class A 
j = B(i)# this will return exception 
j.functionIneed() 

클래스 A를 변경할 수 없습니다. 클래스 A에 functionIneed를 구현할 수는 있지만 코드 구조로 인해 불가능합니다. 감사합니다.

답변

12

파이썬은 "캐스팅"을 지원하지 않습니다. B.__init__()을 작성하여 A을 취하여 적절히 초기화해야합니다.

+1

이것은 내 것보다 나은 대답입니다. –

3

나는 당신이 이것을하도록 요구하는 프로그램 설계에 무언가 잘못된 것이 있다는 강한 의혹을 가지고 있습니다. 파이썬에서는 자바와는 달리 클래스가 해결해야 할 문제가 거의 없다. 당신이 필요로하는 기능이 있다면, 간단하게 정의

:

def function_i_need(a): 
    """parameter a: an instance of A""" 
    pass # do something with 'a' 

을하지만, 나는 당신의 기능 클래스의 방법을 만들기에서 당신을 단념 할 수없는 경우, 당신은 __class__ 속성을 설정하여 인스턴스의 클래스를 변경할 수 있습니다

>>> class A(object): 
...  def __init__(self): 
...   pass 
... 
>>> class B(A): 
...  def functionIneed(self): 
...   print 'functionIneed' 
... 
>>> a = A() 
>>> a.functionIneed() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'A' object has no attribute 'functionIneed' 
>>> a.__class__ = B 
>>> a.functionIneed() 
functionIneed 

__init__이 절대 호출되지 않으므로 B는 __init__ 메서드가없는 한 작동합니다.

class B(A): 
    def functionIneed(): 
     pass 

그러나 (당신이 처음에 class 또는 static 방법을 만드는 의도는 제외) 정말 당신이 만드는 것입니다 것은 더이 같은 것입니다 :

+1

방금 ​​더 나은 대안이 될 수도 있고 훨씬 멀 수도있는 대안 솔루션에 관해 블로그에 올렸습니다. '__class__'을 사용하는 것은 이상하고 위험 할 수도 있지만 CPython에서 작동하는 것으로 보입니다. - [Python "Cast 생성자] (http://late.am/post/2012/04/05/)를 참조하십시오. a-python-cast-constructor) – dcrosta

+1

@dcrosta 그 게시물을 답으로 바꾸시겠습니까? 알다시피, linkrot 등 –

2

당신은 당신이 뭔가를 구현하고자했다 :

class B(A): 
    def functionIneed(self): 
     pass 

그런 다음 B.functionIneed(instance_of_A)으로 전화 할 수 있습니다.

i = module.getObject() # i will get object that is class A 
try: 
    i.functionIneed() 
except AttributeError: 
    # handle case when u have a bad object 

오리 입력에 최대 읽기 :에 대해 어떻게

관련 문제