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
您无法访问它,因为Transcription在def语句运行时未定义它.
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没有意义.
| 归档时间: |
|
| 查看次数: |
469 次 |
| 最近记录: |