2011-01-11 9 views
3

나는 여기서 중요한 부분은 내가 변수의 디폴트 값으로 클래스 멤버를하고 싶은 것입니다 다음 코드왜이 클래스 멤버에 파이썬으로 액세스 할 수 없습니까?

class Transcription(object): 
    WORD = 0 
    PHONE = 1 
    STATE = 2 

    def __init__(self): 
     self.transcriptions = [] 

    def align_transcription(self,model,target=Transcription.PHONE): 
     pass 

에게 있습니다.

NameError: name 'Transcription' is not defined 

왜이 불가능하며 어떤 같은 것을 할 수있는 권리 (파이썬) 방법은 다음과 같습니다 그러나 이것은 다음과 같은 오류를 제공합니다.

+0

올바른 방법을 :

다른 옵션은 다른 클래스의 상수를 정의하거나 클래스의 외부 align_transcription 방법을 결합 할 수 있습니까? 말하기 어렵다. 너는 무엇을하려고 하는가? 왜 객체의 클래스를 그 객체의 함수에 전달하겠습니까? 네가 여기서 뭘하려고하는지 나는 모르겠다. –

+2

그는 메소드 매개 변수의 기본값으로 클래스에 범위가 지정된 상수를 사용하려고합니다. –

+0

맞습니다. 내 잘못이야. 구문 색칠은 나를 눈 멀게했다. :) –

답변

11

def 문이 실행될 때 Transcription이 정의되어 있지 않으므로 액세스 할 수 없습니다.

def align_transcription(self,model,target=PHONE): 
     pass 

트릭을 수행합니다. PHONE 이름은 Transcription 클래스 이되며class 문 실행이 완료된 후 이름 공간에서 사용할 수 있습니다.

이 작동 방식은 class이 실제로 실행되는 문입니다. 파이썬이 클래스 문을 만나면 새로운 로컬 범위를 입력하고 class 문 아래로 들여 쓰기 된 모든 것을 함수처럼 실행합니다. 그 다음 생성 된 네임 스페이스, 클래스 이름 및베이스 클립의 튜플을 메타 클래스 (기본값 : type)으로 전달합니다. 메타 클래스는 실제 클래스 인 자체의 인스턴스를 반환합니다. 이 중 어떤 것도 def 문이 실행될 때 발생하지 않았습니다.

class Foo(object): 
    a = 1 
    def foo(self): 
     print self.a 

네임 스페이스 ns = {'a': 1, 'foo': foo}를 만든 다음

Foo = type('Foo', (object,), ns) 

def foo(self): 
    print self.a 

Foo = type('Foo', (object,), {'a': 1, 'foo': foo}) 

당신은 Foo이 시점에서 정의되지 않은 것을 분명히 알 수에 해당 실행 foo이 정의되어 있습니다. Foo.a은 의미가 없습니다.

+0

+1 매우 명쾌한 설명! – EOL

1

align_transcription 메서드를 정의 할 때 트랜잭션 클래스가 아직 존재하지 않지만 해당 범위에서 PHONE을 사용할 수 있습니다. 그래서 ,이 방법 중 하나를 수행 할 수 있습니다

def align_transcription(self,model,target=None): 
    if target is None: 
     target = self.PHONE 
2

클래스는 이름과 연관되지 않습니다 : 당신이 하위 클래스 또는 인스턴스에 전화를 대체하려는 경우

class Transcription(object): 
    WORD = 0 
    PHONE = 1 
    STATE = 2 

def __init__(self): 
    self.transcriptions = [] 

def align_transcription(self,model,target=PHONE): 
    pass 

또는 대상 = 없음 기본적으로

정의가 끝날 때까지 잘 될 것 대신 WORD의 제로로 PHONE을 설정, 또는

class Transcription(object): 
    WORD = 1 # zero won't work below... need to change the value 
    PHONE = 2 
    STATE = 3 

    def align_transcription(self, model, target=None): 
     target = target or Transcription.PHONE 
     # or 
     if target is None: target = Transcription.PHONE 

:이다

방법은 내가 이것을 쓰는 것이다 (그리고 나는 그것이 파이썬하다고 보장 할 수 없습니다).if 문은 상수 값에 관계없이 작동하지만 or은 0 값을 PHONE으로 바꿉니다.

class Transcription(object): 
    WORD = 0 
    PHONE = 1 
    STATE = 2 

def _unbound_align_transcription(self, model, target=Transcription.PHONE): 
    pass 

Transcription.align_transcription = _unbound_align_transcription 
+1

또는 http://stackoverflow.com/questions/4655745/why-can-i-not-access-this-class-member-in-python/4655770#4655770에서와 같이하십시오 ... 그 사실을 알았습니다. 그것을 즉시 생각하지 마십시오. – Zooba

+0

"클래스 객체는 정의가 완료 될 때까지는 사용할 수 없습니다." –

+0

클래스 내에서 정의 된 값을 제외하고는 사실입니다. 트릭은 해당 바인딩 된 함수 * signatures * ('def' 라인)은 정의 된 지점에서 클래스 범위 내에 있고, 바인딩 된 함수 * code *는 그렇지 않습니다. 그리고 명확하게하기 위해 클래스 이름을 사용할 필요가 있습니다. – Zooba

관련 문제