Python - 从类体内引用类名

时间:2010-07-23 05:06:58

标签: python static class-attributes

在Python中,我希望有一个带有初始化值的类属性,一个字典。我写了这段代码:

class MetaDataElement:
    (MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
    mapInitiator2Type = {'!':MetaDataElement.MD_CATEGORY, 
                         '#':MetaDataElement.MD_TAG}

但是当我尝试运行此代码时,我收到一条错误消息“NameError:name'MetaDataElement'未定义”。你能帮帮我吗?

提前致谢。

2 个答案:

答案 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}