正在建设中,而它不能指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
,在这里,因为当执行method_of_MetaDataElement()
时MD_TAG
不是一种局部变量(MD_TAG
仅在类构造期间被定义为一种局部变量)。一旦类MetaDataElement
创建,MD_TAG
只是一个类属性,这就是为什么method_of_MetaDataElement()
必须这样。
来源
2010-07-23 06:46:02
EOL
最后一个例子可以用'self.MD_TAG'编写,它避免了引用类的任何需要名称。 – Marcin 2012-07-13 03:43:38
@Marcin:'self.MD_TAG'也是一种可能性,但它不等同于'MetaDataElement.MD_TAG',如果MetaDataElement被子类化(子类可能会覆盖'MD_TAG')。两者都是有效的,但哪一个选择取决于当前的情况。 – EOL 2012-07-13 07:48:33
老实说,我认为防止子类能够有效地改变类成员的方法可能是错误的,这就是为什么我会推荐使用'self',除非有特定的理由来阻止它。 – Marcin 2012-07-13 13:14:05