我有以下代码
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)方式来做这样的事情。
发布于 2011-01-11 16:52:24
您不能访问它,因为在运行def语句时没有定义Transcription。
def align_transcription(self,model,target=PHONE):
pass就能达到目的。PHONE名称在名称空间中可用,在class语句执行完成后,该名称空间将成为Transcription类。
它的工作方式是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没有任何意义。
发布于 2011-01-11 16:58:40
直到定义结束,类才与其名称相关联。
我写这篇文章的方式(我不能保证它是Pythonic式的)是:
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或者,将PHONE设置为0而不是WORD也可以。无论常量的值是多少,if语句都会起作用,但是or会用PHONE替换零值。
其他选项是在另一个类中定义常量,或者在类外部绑定align_transcription方法:
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发布于 2011-01-11 16:57:04
当您定义align_transcription方法时,Transaction类还不存在,但PHONE在作用域中可用。因此,您可以使用以下两种方法之一:
class Transcription(object):
WORD = 0
PHONE = 1
STATE = 2
def __init__(self):
self.transcriptions = []
def align_transcription(self,model,target=PHONE):
pass或者,如果您计划覆盖子类或实例中的PHONE,则使用target=None默认值:
def align_transcription(self,model,target=None):
if target is None:
target = self.PHONEhttps://stackoverflow.com/questions/4655745
复制相似问题