为什么我不能在python中访问这个类成员?

Pet*_*mit 3 python class-members

我有以下代码

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

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

    def align_transcription(self,model,target=Transcription.PHONE):
        pass
Run Code Online (Sandbox Code Playgroud)

这里的重要部分是我希望有一个类成员作为变量的默认值.但是会出现以下错误:

NameError: name 'Transcription' is not defined
Run Code Online (Sandbox Code Playgroud)

为什么这不可能,什么是正确的(pythonic)方式来做这样的事情.

aar*_*ing 11

您无法访问它,因为Transcriptiondef语句运行时未定义它.

 def align_transcription(self,model,target=PHONE):
        pass
Run Code Online (Sandbox Code Playgroud)

会做的.该PHONE名称在命名空间中可用,该语句将在语句完成执行成为Transcription类.class

这种方式的工作方式是实际运行class的语句.当Python遇到一个类语句时,它进入一个新的本地作用域并执行在语句下缩进的所有内容,就像它是一个函数一样.然后将其传递所得到的命名空间,类的名称和基类到的元组的元类是默认.元类返回自身的实例,它是实际的类.语句执行时没有发生这种情况.classtypedef

该声明

class Foo(object):
    a = 1
    def foo(self):
        print self.a
Run Code Online (Sandbox Code Playgroud)

创建一个命名空间ns = {'a': 1, 'foo': foo},然后执行

Foo = type('Foo', (object,), ns)
Run Code Online (Sandbox Code Playgroud)

这相当于

def foo(self):
    print self.a

Foo = type('Foo', (object,), {'a': 1, 'foo': foo})
Run Code Online (Sandbox Code Playgroud)

您可以清楚地看到,Foo在定义时foo未定义,因此Foo.a没有意义.