2014-06-24 3 views
1

클래스의 인스턴스를 만들 때 어떻게 든 이상한 오류가 발생합니다.수퍼 클래스의 __init__ 메서드를 호출 할 때 TypeError가 발생했습니다.

... 
    File <file1>, line 242, in some_method 
    created_object = SubClass(obj1, obj2) 
    File <file2>, line 11, in __init__ 
    SuperClass.__init__(self, obj1) 
TypeError: expected string or buffer 

은 여기 두 __init__ 방법이 어떻게 생겼는지 :

class SubClass(SuperClass): 
    def __init__(self, obj1=None, obj2=None): 
     SuperClass.__init__(self, obj1) 
     ... 

class SuperClass(object): 
    def __init__(self, obj1=None, obj2=None): 
     self.obj1 = obj1 

다른 인스턴스를 생성하는 서브 클래스의 인스턴스를 생성합니다 "파일 1"에서 동일한 코드 같은 슈퍼 클래스의 서브 클래스 그들은 모두 비슷한 객체를 인수로 받지만 하위 클래스 중 하나만이 오류를 일으키고 있습니다. 또한 작업 서브 클래스 중 적어도 하나는 정확히 동일한 정의와 __init__ 메소드의 첫 번째 라인을가집니다.

이 오류는 "file1"을 약간 변경 한 후에 나타 났지만 서브 클래 싱 객체 나 내가 전달한 객체를 인스턴스화하는 방식을 건드리지 않았습니다.

어쨌든, 나는 단순히 오류를 이해하지 못합니다. 문자열이나 버퍼를 기대하는 이유와 그 이유는 무엇입니까?

누구든지이 오류에 불을 붙일 수 있습니까?

편집 :

self.SubClass = getattr(importlib.import_module(subclass_module), 'SubClass') 
del sys.modules[subclass_module] # Premature optimization strikes again! 

으로 내가 게시 된이 질문에 대해 설명, 나는 위의이 오류가 발생하는 원인이 무엇임을 알아 냈다. 그러나 약간의 파기로 인해 오류 자체에 대해 더 혼란스러워졌습니다. 나는이에 __init__ 방법 변경 :

def __init__(self, obj1=None, obj2=None): 
    print None.__init__ 
    None.__init__('Hello', 'World') 

을이처럼 전화 :

print None.__init__ 
None.__init__('Hello', 'World') 
obj = self.SubClass(obj1, obj2) 

나는 여전히이야 점점하여 __init__ 방법 TypeError, 하지만 내가 그것을 호출 할 때 그 바로 전에. 여기에 두 줄을 내가 넣어 두 인쇄의 dis module

# None.__init__('Hello', 'World') in SubClass.__init__ 
10  9 LOAD_CONST    0 (None) 
     12 LOAD_ATTR    1 (__init__) 
     15 LOAD_CONST    1 ('Hello') 
     18 LOAD_CONST    2 ('World') 
     21 CALL_FUNCTION   2 
     24 POP_TOP 

# None.__init__('Hello', 'World') right before I try to create the SubClass object 
246  147 LOAD_CONST    0 (None) 
     150 LOAD_ATTR    7 (__init__) 
     153 LOAD_CONST    5 ('Hello') 
     156 LOAD_CONST    6 ('World') 
     159 CALL_FUNCTION   2 
     162 POP_TOP 

출력을 사용하여 분해하는 이것이다 :

<method-wrapper '__init__' of NoneType object at 0x102977538> 
<method-wrapper '__init__' of NoneType object at 0x102977538> 

그래서 같은 __init__ 방법 상수 호출 때마다, 그러나와 다른 결과. 여기서 무슨 일이 일어나고있는거야? 문제가 해결되지 않은 super(SubClass, self).__init__(obj)로 변경하지만

+0

'super (SubClass, self) .__ init __ (obj1, * args, ** kwargs)'? – karthikr

+1

문제를 재현 할 수 없습니다. 그렇게하는 [SSCCE] (http://sscce.org/)를 제공하십시오. – martineau

+0

@martineau 오류를 재생산하는 SSCCE를 만들 수 없습니다. 나는 문제의 근원을 알아 냈다. 그러나 오류 자체는 나에게 절대적인 수수께끼이다. –

답변

0

이에 오류를 변경했다 :

TypeError: must be type, not None 

Based on something I learned previously이 문제는 내가하려고했던 일부 (아마도 조기) 메모리 최적화했다 인한 변경 - 삭제 모듈은 sys.modules입니다. 가비지 콜렉션에 따라 SubClassSuperClass의 가져 오기가 모두 None이되었습니다. 모듈을 sys.modules에두면 문제가 해결됩니다.

오류의 원인을 알면 오류 자체를 이해하는 데 도움이되지 않습니다. 나는 아직도 내가 왜 TypeError: expected string or buffer을 얻는 지 이해하지 못한다.

관련 문제