Python-从类主体内部引用类名

Python-从类主体内部引用类名,python,static,class-attributes,Python,Static,Class Attributes,在Python中,我希望有一个类属性,一个字典,带有初始化值。我写了这段代码: class MetaDataElement: (MD_INVALID, MD_CATEGORY, MD_TAG) = range(3) mapInitiator2Type = {'!':MetaDataElement.MD_CATEGORY, '#':MetaDataElement.MD_TAG} 但当我尝试运行这段代码时,会收到一条错误消息,其中

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

class MetaDataElement:
    (MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
    mapInitiator2Type = {'!':MetaDataElement.MD_CATEGORY, 
                         '#':MetaDataElement.MD_TAG}
但当我尝试运行这段代码时,会收到一条错误消息,其中显示“NameError:name'MetaDataElement'未定义”。你能帮我吗


提前感谢。

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

class MetaDataElement(object):
    ...
注意
(对象)
。不过,无论如何,只要在引用类属性时删除
元数据元素。
。这就是完成后的样子:

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

在构造元数据元素时不能引用它,因为它还不存在。因此,

class MetaDataElement:
    (MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
    mapInitiator2Type = {'!':MetaDataElement.MD_CATEGORY, 
                         '#':MetaDataElement.MD_TAG}
失败,因为
mapInitiator2Type
的构造需要
MetaDataElement
具有属性,而它还没有属性。您可以将常量
MD\u 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\u-TAG()的
method\u
时,
MD\u-TAG
不是一种局部变量(
MD\u-TAG
仅在类构造期间定义为一种局部变量)。一旦类
MetaDataElement
被创建,
MD\u TAG
只是一个类属性,这就是为什么
method\u of_MetaDataElement()
必须引用它的原因。

也许redism是用Python 3编写的,并且使用了新样式的类。:)@EOL:我不知道Python3默认使用了新样式的类。这很好。这里有一个参考:“经典类已经消失了。”()最后一个示例可以使用
self.MD_标记
编写,这样就不需要引用类名。@Marcin:
self.MD_标记
也是一种可能,但它并不等同于
MetaDataElement.MD_标记
,如果
MetaDataElement
是子类化的(子类可能会覆盖
MD_标记
)。这两种方法都是有效的,但选择哪一种取决于当前的情况。老实说,我认为阻止子类有效地更改类成员的方法可能是错误的,这就是为什么我建议使用
self
,除非有具体的原因阻止它。