2013-01-09 2 views
3

3 단계를 모두 유지하면서이 오류를 수정하는 간단한 방법이 있습니까?파이썬에서 3 개의 클래스를 중첩 할 때 잘못된 구문이 있습니까?

개체에서 ClassA를 파생하는 것은 도움이되지 않습니다.

미리 감사드립니다. 당신이 classC를 정의시

>>> class classA: 
...  class classB(object): 
...   def __init__(self): 
...    self.b = 3 
...   class classC(classA.classB): 
...    def __init__(self): 
...     super(classC, self).__init__() 
...     self.c = 4 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in classA 
    File "<stdin>", line 5, in classB 
NameError: name 'classA' is not defined 
+7

왜 이렇게할까요? –

+0

클래스 이름이 더 짧아지며 코드가 더 읽기 좋게됩니다. –

+0

도 thid = s가 작동하지 않는 이유를 알고 싶습니다. 어쩌면 나는 몇몇 중요한 개념을 놓친다. –

답변

8

번호, classA은 아직 존재하지 않습니다.

본문이 완전히 실행 된 후에 만 ​​만들어집니다. (신체 실행으로 작성된 사전은 클래스 작성 호출 class = type('classname', (superclass_1, superclass_2, superclass_3), said_dict})에 대한 하나의 매개 변수입니다.)

가장 쉬운 방법은 동일한 레벨에서 정의하는 것입니다. 절대적으로 필요한 경우

, 당신은 나중에 수정할 수 있습니다

class classA: 
    pass 
class classB(object): 
    def __init__(self): 
     self.b = 3 
class classC(classB): 
    def __init__(self): 
     super(classC, self).__init__() 
     self.c = 4 
classA.classB = classB 
classB.classC = classC 
+2

답변에 클래스 본문의 모든 문이 실행될 때까지 classA가 존재할 수없는 이유에 대한 설명을 추가하는 것이 유용 할 수 있습니다. – Duncan

-1

어쩌면이 같은 것이 작동합니다 :

class classA: 
    pass 

class classB(object): 
    def __init__(self): 
     self.b = 3 
classA.classB = classB 

class classC(classA.classB): 
    def __init__(self): 
     super(classC, self).__init__() 
     self.c = 4 

classA.classB.classC = classC 
+1

마지막 줄을 더 장황하게 만드는 것 외에도 @ glglgl의 대답에 아무 것도 추가하지 않습니다. – Duncan

+0

@Duncan, 네 말이 맞아. 내가 글을 올렸을 때 glglgl의 대답에 코드가 없었어. –