我有以下代码

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

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

最佳答案

您无法访问它,因为在 Transcription 语句运行时未定义 def

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

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

它的工作方式是 class 是一个实际运行的语句。当 Python 遇到 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 没有意义。

关于python - 为什么我不能在python中访问这个类成员?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4655745/

10-09 17:09
查看更多