Python-从类主体内部引用类名
在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} 但当我尝试运行这段代码时,会收到一条错误消息,其中
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
,除非有具体的原因阻止它。