正在建設中,而它不能指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