3

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

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

但是当我尝试运行此代码时,我收到一条错误消息,其中包含“NameError:名称'MetaDataElement'未定义”。你可以帮帮我吗?

提前致谢。

4

2 回答 2

3

你不能MetaDataElement在它被构建的时候引用它,因为它还不存在。因此,

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

之所以失败,是因为它的构造本身就mapInitiator2Type需要MetaDataElement具有它还没有的属性。您可以将常量MD_INVALID等视为构建类的本地变量。这就是为什么以下工作有效的原因,正如 icktoofay 所写:

class MetaDataElement:
    (MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
    mapInitiator2Type = {'!': MD_CATEGORY,  # MD_CATEGORY is like a local variable!
                         '#': MD_TAG}

MetaDataElement但是,您可以在任何尚未解释的代码中引用该类,如

    def method_of_MetaDataElement(self):
        print MetaDataElement.MD_TAG

你甚至参考MetaDataElement,这里,因为在执行MD_TAG时不是一种局部变量(在类构造过程中只定义为一种局部变量)。一旦创建了类,它就是一个类属性,这就是为什么必须这样引用它。method_of_MetaDataElement()MD_TAGMetaDataElementMD_TAGmethod_of_MetaDataElement()

于 2010-07-23T06:46:02.840 回答
1

首先,您使用的是旧式类。您可能应该使用新型类,如下所示:

class MetaDataElement(object):
    ...

注意(object). 不过,无论如何,只需MetaDataElement.在引用类属性时删除 。这是完成后的样子:

class MetaDataElement(object):
    (MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
    mapInitiator2Type = {'!': MD_CATEGORY, 
                         '#': MD_TAG}
于 2010-07-23T05:09:47.510 回答