2012-07-05 4 views
0

기본에 변수를 사용해야하므로 유형이있는 클래스를 작성합니다. __init__ 메서드를 제공하지 않으면 정상적으로 작동하지만 하나를 제공하면 해당베이스의 __init__을 호출 할 수 없습니다.type()으로 작성된 클래스에서 기본 __init__을 호출 할 수 없습니다.

작품 :

def constructor(): 
    global api 
    blah blah 
    api = importlib.import_module(xtype) 
    mc = type('mc', (api.aclass,), dict(__init__ = mc__init) 
    obj = mc(**args) 
    return obj 

def mc_init(*args, **kwargs): 
    global api 
    do_some_stuff 
    api.aclass.__init__(*args, **kwargs) 

x = constructor() 

:

def constructor(): 
    blah blah 
    api = importlib.import_module(xtype) 
    mc = type('mc', (api.aclass,), {}) 
    obj = mv(**args) 
    return obj 

이 작동하지 않습니다는 "SystemError: super(): __class__ cell not found"가 작동하지 않습니다

def constructor(): 
    blah blah 
    api = importlib.import_module(xtype) 
    mc = type('mc', (api.aclass,), dict(__init__ = mc__init) 
    obj = mc(**args) 
    return obj 

def mc_init(*args, **kwargs): 
    do_some_stuff 
    super().__init__(*args, **kwargs) 
가, 나중에 객체 생성에서 " Base mc.__init__ not called."를 반환 반환 초기화은 어떻게 호출 할 수 있습니까? 기본 클래스?

감사합니다.

+0

"Accepted"(녹색 확인 표시)로 만족하는 답을 표시 할 것을 강력히 제안합니다. 당신은 7 가지 질문을했고 그 중 어느 것도 받아 들여지지 않았습니다. 이것은 드문 경우입니다. 그들이 문제를 해결하기를 희망한다면, 사람들은 대답하도록 동기를 부여 할 것입니다. – EOL

답변

1

귀하의 type 통화가 작동 중입니다. bases은 튜플 ((api.aclass,))이어야합니다. 이것은 단지 오타입니까?

super() (2)의 호출은 클래스 선언 외부이므로 호출되지 않습니다. 파이썬 3 super 마술은 매우 복잡하고 솔직히 조금 허약합니다. super(mc, self).__init__(*args, **kwargs)을 쓸 수 있습니다.

그러나 여기에 적절한 클래스 선언을 사용하지 않아도됩니다 (특히 3 인수 type을 사용하는 방법을 이해하지 못하는 경우).

def constructor(): 
    ... 
    api = importlib.import_module(xtype) 
    class mc(api.aclass): 
     def __init__(self, *args, **kwargs): 
      super().__init__(*args, **kwargs) 
    obj = mc(**args) 
    return obj 
+0

감사합니다. 오타 였고 지금 편집했습니다. –

+0

'super (mc, self)'가 작동하지 않는다.'NameError : global name 'mc'is not defined '하지만 전역으로 만들 수 있다고 생각한다. 변수를 기반으로 사용할 수 있다는 것을 깨닫지 못했습니다. –

관련 문제