2010-07-23 3 views
1

파이썬에서는 초기화 된 값을 가진 클래스 속성, 사전을 갖고 싶습니다. 이 코드 작성 :Python - 클래스 본문의 클래스 이름 참조하기

class MetaDataElement: 
    (MD_INVALID, MD_CATEGORY, MD_TAG) = range(3) 
    mapInitiator2Type = {'!':MetaDataElement.MD_CATEGORY, 
         '#':MetaDataElement.MD_TAG} 

을하지만이 코드를 실행하려고 할 때, 나는 함께 오류 메시지가 "나가서 설명하자면 NameError : 이름이 'MetaDataElement'정의되지 않았습니다." 당신이 나를 도울 수?

미리 감사드립니다.

답변

2

: 이것은 그가 끝나면 같이 줄 것입니다. mapInitiator2Type의 매우 건설이 아직없는 어떤 특성을 가지고 MetaDataElement을 필요로하기 때문에 따라서,

class MetaDataElement: 
    (MD_INVALID, MD_CATEGORY, MD_TAG) = range(3) 
    mapInitiator2Type = {'!':MetaDataElement.MD_CATEGORY, 
         '#':MetaDataElement.MD_TAG} 

이 실패합니다. 당신은 여러분의 상수 인 MD_INVALID 등을 클래스의 생성에 국한된 변수로 생각할 수 있습니다. icktoofay으로 다음 작품을 쓴 이유이다 : 그러나

class MetaDataElement: 
    (MD_INVALID, MD_CATEGORY, MD_TAG) = range(3) 
    mapInitiator2Type = {'!': MD_CATEGORY, # MD_CATEGORY is like a local variable! 
         '#': MD_TAG} 

, 당신은 당신도 이의

def method_of_MetaDataElement(self): 
     print MetaDataElement.MD_TAG 

으로, 코드의 아직되지 않은 해석 조각 클래스 MetaDataElement를 참조 할 수 있습니다 MD_TAGmethod_of_MetaDataElement() 실행 로컬 변수 (MD_TAG 단지 클래스 구조 중에 로컬 변수의 종류로 정의 하였다)의 종류가 아니기 때문에 여기 MetaDataElement을 참조한다. MetaDataElement 클래스가 만들어지면 MD_TAG은 단순히 클래스 속성이므로 method_of_MetaDataElement()은 클래스 속성으로 참조해야합니다.

+0

마지막 예제는'self.MD_TAG'로 쓰여질 수 있는데, 이것은 클래스를 참조 할 필요가 없다. 이름. – Marcin

+0

@Marcin :'self.MD_TAG'도 가능 합니다만,'MetaDataElement'가 서브 클래스 화 (하위 클래스는'MD_TAG'를 덮어 쓰기)하는 경우'MetaDataElement.MD_TAG'와 동일하지 않습니다. 둘 다 유효하지만 선택해야하는 것은 현재의 상황에 달려 있습니다. – EOL

+0

솔직히 말해서, 하위 클래스가 클래스 멤버를 유용하게 변경할 수 없도록하는 방법이 잘못되었다고 생각합니다. 따라서이를 방지 할 구체적인 이유가없는 한 'self'를 사용하는 것이 좋습니다. – Marcin

0

우선, 이전 스타일의 클래스를 사용하고 있습니다. 다음과 같이 새로운 스타일의 클래스를 사용해야합니다.

class MetaDataElement(object): 
    ... 

(object)에 유의하십시오. 어쨌든, 클래스 속성을 참조 할 때 MetaDataElement.을 제거하면됩니다. 이 건설되는 동안 아직 존재하지 않기 때문에 당신은 MetaDataElement를 참조 할 수 없습니다

class MetaDataElement(object): 
    (MD_INVALID, MD_CATEGORY, MD_TAG) = range(3) 
    mapInitiator2Type = {'!': MD_CATEGORY, 
         '#': MD_TAG} 
+0

아마도 redism은 Python 3에서 작성하고 *는 새로운 스타일의 클래스를 사용합니다. :) – EOL

+0

@ EOL : 파이썬 3이 기본적으로 새로운 스타일의 클래스를 사용한다는 것을 몰랐습니다. 그거 알아두면 좋을거야. – icktoofay

+0

다음은 참조입니다 : "클래식 클래스가 없어졌습니다." (http://docs.python.org/release/3.0.1/whatsnew/3.0.html#removed-syntax) – EOL