在Python中,我希望有一个带有初始化值的类属性,一个字典。我写了这段代码:
class MetaDataElement:
(MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
mapInitiator2Type = {'!':MetaDataElement.MD_CATEGORY,
'#':MetaDataElement.MD_TAG}
但是当我尝试运行此代码时,我收到一条错误消息“NameError:name'MetaDataElement'未定义”。你能帮帮我吗?
提前致谢。
答案 0 :(得分:2)
在构建MetaDataElement
时,您无法引用class MetaDataElement:
(MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
mapInitiator2Type = {'!':MetaDataElement.MD_CATEGORY,
'#':MetaDataElement.MD_TAG}
,因为它尚不存在。因此,
mapInitiator2Type
失败是因为MetaDataElement
的构造要求MD_INVALID
拥有属性,而这些属性尚未拥有。您可以将常量class MetaDataElement:
(MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
mapInitiator2Type = {'!': MD_CATEGORY, # MD_CATEGORY is like a local variable!
'#': MD_TAG}
等视为类构造的局部变量。这就是为什么以下工作,如icktoofay写道:
MetaDataElement
但是,您可以在任何尚未解释的代码段中引用类 def method_of_MetaDataElement(self):
print MetaDataElement.MD_TAG
,如
MetaDataElement
你甚至 来引用MD_TAG
,因为method_of_MetaDataElement()
在执行MD_TAG
时不是一种局部变量(MetaDataElement
}只在类构造期间被定义为一种局部变量)。创建课程MD_TAG
后,method_of_MetaDataElement()
只是一个类属性,这就是{{1}}必须引用它的原因。
答案 1 :(得分:0)
首先,您使用的是旧式课程。您应该使用新式类,如下所示:
class MetaDataElement(object):
...
请注意(object)
。但是,无论如何,只需在引用类属性时删除MetaDataElement.
。这就是完成后的样子:
class MetaDataElement(object):
(MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
mapInitiator2Type = {'!': MD_CATEGORY,
'#': MD_TAG}