我有以下代码
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/